当我运行我的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>
答案 0 :(得分:2)
当前代码假定richtext
可以包含par
个元素,或table
,或者不是两者。在两者都匹配的情况下,两个模板都匹配相同的优先级,这被认为是错误(XSLT可能标记错误,或者选择最后一个模板)。
一种方法是必须为他们提供mode
个属性,但只有一个匹配richtext
的模板,他们根据table
或par
应用相关模板(或两者都存在:
<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
无论如何都无能为力。