XSLTスタイルシートを実行すると、あいまいなルールの一致の警告が表示され、テンプレートの1つが呼び出されません。 richtext [par]の一致基準を持つテンプレートが呼び出されますが、richtext [table]の一致基準を持つテンプレートは一致しません。両方のテンプレートを起動して警告メッセージを表示させない方法ここでXSLTの曖昧なルールの一致の警告
がXMLである:
<?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>
そして、ここではXSLTです:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="html"/>
<xsl:template match="/*">
<html>
<body>
<table border="1">
<tbody>
<xsl:apply-templates/>
</tbody>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<tr>
<td><xsl:value-of select="@name"/></td>
<td>
<xsl:apply-templates/>
</td>
</tr>
</xsl:template>
<xsl:template match="richtext[table]">
<table border="1">
<xsl:for-each select="tablerow">
<tr>
<xsl:for-each select="tablecell">
<td>
<xsl:apply-templates />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template match="richtext[par]">
<xsl:for-each-group select="par[run[normalize-space()]]" group-adjacent="if (@def) then @def else preceding-sibling::par[run[normalize-space()]][@def][1]/@def">
<xsl:variable name="listType" select="preceding-sibling::*[1][self::pardef]/@list" />
<xsl:choose>
<xsl:when test="$listType = 'bullet'">
<ul>
<xsl:apply-templates select="current-group()" mode="list"/>
</ul>
</xsl:when>
<xsl:when test="$listType = 'ordered'">
<ol>
<xsl:apply-templates select="current-group()" mode="list"/>
</ol>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()" mode="para" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="par" mode="list">
<li>
<xsl:apply-templates select="run" />
</li>
</xsl:template>
<xsl:template match="par" mode="para">
<p>
<xsl:apply-templates select="run" />
</p>
</xsl:template>
<xsl:template match="run">
<xsl:choose>
<xsl:when test="font[@style = 'underline']">
<span style="text-decoration: underline;">
<xsl:value-of select="text()" separator=""/>
</span>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text()" separator=""/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
あなたのテンプレート 'richtext [table]'を見てください。コンテキストノードは "richtext"ですが、要素 "table"を作成します。だからあなたは 'richtext'をテーブルに置き換えます! [for-eachは何も実行せず、ノード上でxpathが一致しません。たぶんその "リッチテキスト/テーブル"に変更することによって解決? – uL1