XSLT 2.0:查找子串的开始和结束索引

XSLT 2.0:查找子串的开始和结束索引

问题描述:

我正在使用寄存器和寄存器位数据的XML文件,其中包含大量复制并将其压缩为压缩表示法。为了做到这一点,我需要检测两个或更多注册名称何时表明它们实际上除了名称之外是相同的。XSLT 2.0:查找子串的开始和结束索引

例如:

<register_block> 
    <register> 
     <register_name>FN0_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    <register> 
     <register_name>FN1_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    <register> 
     <register_name>FN2_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    . 
    . 
    . 
    <register> 
     <register_name>FN21_FX_FIDO_FEED_HALT</register_name> 
    </register> 
</register_block> 

名称的相同性质保存为递增数字表示寄存器被重复,所以可安全地剥除位并表示寄存器的22次迭代作为一个单一的压缩寄存器。我使用tokenize()和[0-9] [0-9] + _作为RegEx来剥离名称,以便我可以比较它们并构建重组名称(减去递增数字),它主要工作。

不幸的是,某些寄存器第二次出现[0-9] [0-9] + _模式,例如, FN1_SONET_TX1_SQUARE,从事后处理它会把扳手投入事情,它会调用TX1和TX2相同。

所以,我需要的是这样的:
的检测中第一次出现的XSLT 2.0的方式[0-9] [0-9] + _格局及其起始和结束索引,以便我能确定它是否在寄存器名称的前半部分或第二个字符,以及它是2个字符长还是3个。

作为一个附注,我不能确定增加的数字是否在名称的前3或4个字符之内,但如果它存在的话,它会比起始位置更接近起始位置。

+0

嗯。乐趣;有人低估了它的“没有显示太多的研究工作,不清楚,或没有用”,没有打扰评论什么是缺乏努力或不清楚。这看起来很懒,也不清楚。什么让你感到厌烦,神秘驱车 - 被Downvoter? – jrhooker

+0

我不会对downvote做出回应,但是我阅读了你的描述,不知道你想达到什么目的。 [mcve]也可能是一个原因,为什么你会陷入低谷。在缩小版本中显示XSLT的当前状态和预期输出为XML。 – uL1

我会用replace,不tokenize如下:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="register_block"> 
     <xsl:copy> 
      <xsl:for-each-group select="register" group-by="replace(register_name, '^(\p{L}+)[0-9]{1,2}', '$1')"> 
       <group name="{current-grouping-key()}"> 

       </group> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:transform> 

变换

<register_block> 
    <register> 
     <register_name>FN0_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    <register> 
     <register_name>FN1_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    <register> 
     <register_name>FN2_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    . 
    . 
    . 
    <register> 
     <register_name>FN21_FX_FIDO_FEED_HALT</register_name> 
    </register> 
    <register> 
     <register_name>FN1_SONET_TX1_SQUARE</register_name> 
    </register> 
     <register> 
     <register_name>FN1_SONET_TX2_SQUARE</register_name> 
    </register> 

</register_block> 

<?xml version="1.0" encoding="UTF-8"?> 
<register_block> 
    <group name="FN_FX_FIDO_FEED_HALT"/> 
    <group name="FN_SONET_TX1_SQUARE"/> 
    <group name="FN_SONET_TX2_SQUARE"/> 
</register_block>