XSLT 2.0 Anlayze-string选项不起作用



我有一个xml结构,如下

 <warning file="projectSrca.c" line="45" message="intended 7.7. 3218 Decl File scope static, 'DSVS_SLOW_CH_RCVD_INFO_INIT', only accessed in one function."/>
 <warning file="projectSrcx.c" line="132" message="deviation 3218 Decl File scope static,">

我希望文件行和消息以表格格式出现。消息与正则匹配,必须采取。

消息包含等级 - (意图或偏差)可选标准,规则和描述。它被空间

分开

在我的示例中,第一个标签具有file = project src a.c,行= 45,等级=预期,标准7.7。规则3218和说明=声明文件范围....

在第二个示例中缺少。

我需要的是输出

<tr>
    <td>Filename</td>
    <td>Line</td>
    <td>Rank</td>
    <td>Coding Standard</td>
    <td>Rule</td>
    <td>Description</td>
</tr>
<tr>
    <td>projectSrca.c </td>
    <td>45</td>
    <td>intended</td>
    <td>7.7.</td>
    <td>3218</td>
    <td>Decl File scope...</td>
</tr>
<tr>
    <td>projectSrcx.c </td>
    <td>132</td>
    <td>deviation</td>
    <td></td>
    <td>3218</td>
    <td>Decl File scope...</td>
</tr>

到目前为止我尝试过的是

<tr>
                <td>Filename</td>
                <td>Line</td>
                <td>Rank</td>
                <td>Standard</td>
                <td>Rule</td>
                <td>Description</td>
            </tr>
            <xsl:for-each select="issues/warning">
                <tr>
                <td><xsl:value-of select="@file"/></td>
                <td><xsl:value-of select="@line"/></td>
                </tr>
                <xsl:analyze-string select="@message"
                                    regex="s*([intended|deviation])s+(.*)s+(d+)s+(.*)">
                    <xsl:matching-substring>
                        <tr>
                            <td><xsl:value-of select="regex-group(1)"/></td>
                            <td><xsl:value-of select="regex-group(2)"/></td>
                            <td><xsl:value-of select="regex-group(3)"/></td>
                            <td><xsl:value-of select="regex-group(4)"/></td>
                        </tr>
                    </xsl:matching-substring>
                    <xsl:non-matching-substring>
                        <tr>
                            <tr>
                                <td><xsl:value-of select="."/></td>
                            </tr>
                        </tr>
                    </xsl:non-matching-substring>
                </xsl:analyze-string>
            </xsl:for-each>

,但这对我的期望不起作用。行和值正在混合。如何检测是否存在可选标准?感谢任何解决该问题的提示。

我认为您可能需要的表达式是s*(intended|deviation)s+(.+s+)?(d+)s+(.*)(请注意,?用于零或一个出现)

尝试此XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="html" indent="yes" html-version="5"/>
  <xsl:template match="/">
    <xsl:for-each select="issues/warning">
      <tr>
        <td><xsl:value-of select="@file"/></td>
        <td><xsl:value-of select="@line"/></td>
        <xsl:analyze-string select="@message"
                            regex="s*(intended|deviation)s+(.+s+)?(d+)s+(.*)">
          <xsl:matching-substring>
            <td><xsl:value-of select="regex-group(1)"/></td>
            <td><xsl:value-of select="regex-group(2)"/></td>
            <td><xsl:value-of select="regex-group(3)"/></td>
            <td><xsl:value-of select="regex-group(4)"/></td>
          </xsl:matching-substring>
        </xsl:analyze-string>
      </tr>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

请参阅http://xsltfiddle.liberty-development.net/ncdd7mb

最新更新