XSLT模糊规则匹配警告

时间:2016-11-03 12:23:40

标签: xml xslt

当我运行我的XSLT样式表时,我收到一个模糊的规则匹配警告,并且没有调用其中一个模板。调用具有 richtext [par] 匹配条件的模板,但不包含 richtext [table] 匹配条件的模板。如何调用这两个模板并避免出现警告消息?

这是XML:

<connectionStrings>

这是XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <item name="The Item">
        <richtext>
            <pardef/>
            <par def="20">
                <run>This is the </run>
                <run><font style="underline"/>preamble.</run>
            </par>
            <pardef id="21" list="bullet"/>
            <par def="21">
                <run>This is the </run>
                <run>first bullet.</run>
            </par>
            <par def="20">
                <run/>
            </par>
            <par def="21">
                <run>This is the second </run>
                <run>bullet.</run>
            </par>
            <par def="20">
                <run>This is the </run>
                <run>conclusion.</run>
            </par>
            <table>
                <tablerow>
                    <tablecell>
                        <par def="43"><run>Total Savings ($M)</run></par></tablecell>
                    <tablecell>
                        <pardef/>
                        <par def="50"><run></run></par></tablecell>
                    <tablecell>
                        <par def="44"><run>0.9360</run></par></tablecell>
                    <tablecell>
                        <par def="45"><run>5.0047</run></par></tablecell>
                    <tablecell>
                        <par def="46"><run>8.8080</run></par></tablecell></tablerow></table>

        </richtext>
    </item>
</document>

1 个答案:

答案 0 :(得分:2)

当前代码假定richtext可以包含par个元素,或table,或者不是两者。在两者都匹配的情况下,两个模板都匹配相同的优先级,这被认为是错误(XSLT可能标记错误,或者选择最后一个模板)。

一种方法是必须为他们提供mode个属性,但只有一个匹配richtext的模板,他们根据tablepar应用相关模板(或两者都存在:

<xsl:template match="richtext">
    <xsl:if test="par">
        <xsl:apply-templates select="." mode="par" />
    </xsl:if>
    <xsl:if test="table">
        <xsl:apply-templates select="." mode="table" />
    </xsl:if>
</xsl:template>

<xsl:template match="richtext" mode="par">
   <xsl:for-each-group select="par" ...>
      <!-- Current code -->
   </xsl:for-each-group>
</xsl:template>

<xsl:template match="richtext" mode="table">
   <table border="1">
        <xsl:for-each select="table/tablerow">
            <!-- Current code -->
        </xsl:for-each>
    </table>
</xsl:template>

或者,您可以将当前与richtext[table]匹配的模板更改为匹配表格,然后您可以执行此类操作

<xsl:template match="richtext[par]">
     <xsl:for-each-group select="par" ...>
         <!-- Current code -->
     </xsl:for-each-group>
     <xsl:apply-templates select="table" />
</xsl:template>

<xsl:template match="richtext/table">
   <table border="1">
        <xsl:for-each select="tablerow">
            <!-- Current code -->
        </xsl:for-each>
    </table>
</xsl:template>

如果richtext没有par,则会应用XSLT的内置模板,这些将为您选择table元素。

另请注意,由于您位于table元素上,因此您必须将内部xsl:for-each调整为仅选择tablerow

事实上,你也可以这样做:

<xsl:template match="richtext">
     <xsl:for-each-group select="par" ...>
         <!-- Current code -->
     </xsl:for-each-group>
     <xsl:apply-templates select="table" />
</xsl:template>

<xsl:template match="richtext/table">
   <table border="1">
        <xsl:for-each select="tablerow">
            <!-- Current code -->
        </xsl:for-each>
    </table>
</xsl:template>

因此,在没有par的情况下,xsl:for-each-group无论如何都无能为力。