2014-01-14 37 views
0

我對這個XML一個再簡單不過的目標,在新的標籤值:抓住一定的正則表達式和包裝它的使用XSLT

<root> 
    <p>Text here, 12-A</p> 
    <p>Text here, 6-C to 11-D</p> 
    <p>Text here, 1-D, 14-B-145, 9-E-15</p> 
</root> 

字母數字組合的交叉引用,我想將內標籤自己<xref>標籤,所以它看起來是這樣的:

<root> 
    <p>Text here, <xref>12-A</xref></p> 
    <p>Text here, <xref>6-C</xref> to <xref>11-DD</xref></p> 
    <p>Text here, <xref>1-D</xref>, <xref>14-B-145</xref>, <xref>9-E-15</xref></p> 
</root> 

我有什麼不工作:

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

     <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="//text()[matches(., '[0-9]{1,2}-?[A-Z]{0,1}-?[0-9]{0,3}')]"> 
      <xsl:variable name="xref" select="." /> 
      <xref> 
       <xsl:value-of select="$xref" /> 
      </xref> 
     </xsl:template> 
</xsl:stylesheet> 
+0

我不知道如何將XML/XSLT正則表達式的工作或者是什麼引擎它用。 – sln

回答

2

嘗試使用xsl:analyze-string,而不是...

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p"> 
     <p> 
      <xsl:analyze-string select="." regex="\d+-[A-Z](-\d+)?"> 
       <xsl:matching-substring> 
        <xref> 
         <xsl:value-of select="."/> 
        </xref> 
       </xsl:matching-substring> 
       <xsl:non-matching-substring> 
        <xsl:value-of select="."/> 
       </xsl:non-matching-substring> 
      </xsl:analyze-string>   
     </p> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<root> 
    <p>Text here, <xref>12-A</xref> 
    </p> 
    <p>Text here, <xref>6-C</xref> to <xref>11-D</xref> 
    </p> 
    <p>Text here, <xref>1-D</xref>, <xref>14-B-145</xref>, <xref>9-E-15</xref> 
    </p> 
</root> 
0

通常情況下,滾動可選級聯使用:

# [0-9]{1,2}(?:-[A-Z](?:-[0-9]{1,3})?)? 

[0-9]{1,2} 
(?: 
     - [A-Z] 
     (?: - [0-9]{1,3})? 
)? 

如果需要至少數-信,你可以把它細化到要求。

# [0-9]{1,2}(?:-[A-Z](?:-[0-9]{1,3})?)? 

[0-9]{1,2} 
(?: 
     - [A-Z] 
     (?: - [0-9]{1,3})? 
) 

無論哪種方式,您必須具體說明要驗證的內容。
如果它的number-number也可以做到。你在正則表達式中的匹配將會匹配0--
但是,必須有一些最小的剛性框架來區分不重要的文本。