xslt xsl:analyze-string和regex表达式

时间:2012-03-29 18:26:40

标签: xslt

我有一个xml文件,我必须在其中找到模式并在匹配的特定模式周围添加“标记。

<xml>
<foo>
    <id>1</id>
    <description>This is section 1, this is section 1 or 2, this is section 1 and 2</description>
</foo>
</xml>

现在在文件中我必须找到一个模式“第1部分”,“第1部分或第2部分”和“第1部分和第2部分”,并在匹配的单词周围添加“标记。

我写了一个像这样的xslt:

  <xsl:template match="text()">

<xsl:analyze-string select="." regex="section\s\d+|section\s\d+\s+or\s+\d|section\s\d+\s+and\s+\d">
  <xsl:matching-substring>
    <xsl:if test="matches(.,'section\s\d+')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
      <xsl:text>"</xsl:text>       
    </xsl:if>
    <xsl:if test="matches(.,'section\s\d+\s+or\s+\d')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
        <xsl:text>"</xsl:text>       
    </xsl:if>
    <xsl:if test="matches(.,'section\s\d+\s+and\s+\d')" >
      <xsl:text>"</xsl:text>
      <xsl:value-of select="."/>     
      <xsl:text>"</xsl:text>       
    </xsl:if>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="current()"/>
  </xsl:non-matching-substring>
</xsl:analyze-string>
 </xsl:template>

我在这里遇到的问题是模式“第1部分”与所有其他模式匹配,所以我没有得到期望的结果

上述转换结果是

<xml>
  <foo>
      <id>1</id>
      <description>This is "section 1", this is "section 1" or 2, this is "section 1" and 2</description>
  </foo>
</xml>

我想要这个输出。

<xml>
  <foo>
    <id>1</id>
    <description>This is "section 1", this is "section 1 or 2", this is "section 1 and 2"</description>
   </foo>
</xml>

任何想法如何实现它......并获得渴望的结果。

感谢。

2 个答案:

答案 0 :(得分:4)

这似乎适用于您的输入:

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

 <xsl:template match="*">
  <xsl:copy>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:analyze-string select="." regex="section\s+\d+(\s+(or|and)\s+\d+)?">
   <xsl:matching-substring>
     <xsl:text>"</xsl:text>
     <xsl:value-of select="."/>     
     <xsl:text>"</xsl:text>       
   </xsl:matching-substring>
   <xsl:non-matching-substring>
    <xsl:value-of select="current()"/>
   </xsl:non-matching-substring>
  </xsl:analyze-string>
 </xsl:template>

</xsl:stylesheet>

虽然如果你只是生成一个字符串而不是元素,xsl:anayze-string比你需要的更多,这会产生相同的结果:

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

 <xsl:template match="*">
  <xsl:copy>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:value-of  select="replace(.,'section\s+\d+(\s+(or|and)\s+\d+)?','&quot;$0&quot;')"/>
 </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:-1)

快速但不优雅的答案是使测试匹配(。,'section \ s \ d +')而不是(匹配(。,'section \ s \ d + \ s +或\ s + \ d'))或者其他一些