XSLT,使用正则表达式从xml中提取子字符串

时间:2015-09-18 22:13:33

标签: regex xslt

我正在尝试在SVN日志上应用XSLT,我需要从提交消息中提取错误号。我在msg上应用这个正则表达式,但什么都没有回来。我在XSLT中缺少什么? 先感谢您 下面是我从SVN获得的XML:



<?xml version="1.0" encoding="UTF-8"?>
<log>
	<logentry revision="265">
	<author>dre</author>
    <date>2015-04-13T02:35:25.246150Z</date>
    <msg>modified code</msg>
</logentry>
<logentry revision="73283">
	<author>john</author>
	<date>2015-04-13T14:10:20.987159Z</date>
	<msg>fixed bug DESK-1868</msg>
</logentry>
<logentry revision="73290">
	<author>ron</author>
	<date>2015-04-13T14:24:57.475711Z</date>
	<msg>WEBAPP-1868 Fix for pallete list and settings dialog Selected Tab Index</msg>
</logentry>
</log>
&#13;
&#13;
&#13;

&#13;
&#13;
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h2>SVN Issues</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">ver</th>
        <th style="text-align:left">author</th>
        <th style="text-align:left">date</th>
        <th style="text-align:left">ticket</th>
      </tr>
      <xsl:for-each select="log/logentry">
      <tr>
        <td><xsl:value-of select="@revision"/></td>
        <td><xsl:value-of select="author"/></td>
        <td><xsl:value-of select="date"/></td>
        <td>
            
                <xsl:variable name="messageValue" select="msg"/>
                <xsl:analyze-string select="$messageValue" 
                  regex="(DESK|TRS|PEK|WEBAPP)-\d{4}$">
                      <xsl:matching-substring>
                         <bug><xsl:value-of select="regex-group(1)"/></bug>
                      </xsl:matching-substring>
                </xsl:analyze-string>
        </td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:5)

  1. http://www.w3.org/TR/xslt20/#analyze-string

      

    注意:由于regex属性是属性值模板,因此正则表达式中的花括号必须加倍。对于   例如,要匹配一到五个字符的序列,请写入   regex=".{{1,5}}"。对于包含许多卷曲的正则表达式   括号中使用符号可能更方便   regex="{'[0-9]{1,5}[a-z]{3}[0-9]{1,2}'}",或使用变量。

  2. 您不希望使用表达式末尾的$将表达式锚定到行尾。否则,只有当邮件以问题ID结束时,正则表达式才会匹配。

  3. 使用此正则表达式捕获整个错误编号:

    regex="((DESK|TRS|PEK|WEBAPP)-\d{{4}})"