2017-03-25 41 views
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

回答

0

我會用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> 
相關問題