我有一个XML文档:
<Chart>
<ChartAreas>
<ChartArea>
<ChartValueAxes>
<ChartAxis>
<Style>
<Border>
<Color>Tan</Color>
</Border>
<FontFamily>Arial Narrow</FontFamily>
<FontSize>16pt</FontSize>
</Style>
</ChartAxis>
</ChartValueAxes>
</ChartArea>
</ChartAreas>
</Chart>
我有两个模板匹配语句,因为我想要由TemplateA处理的Style / Border元素以及TemplateB处理的Style下的所有其他内容。但是,TemplateB正在处理所有内容。
<xsl:template match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style/Border" >
<xsl:call-template name="TemplateA"/>
</xsl:template>
<xsl:template match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style" >
<xsl:call-template name="TemplateB"/>
</xsl:template>
答案 0 :(得分:2)
您有一个与Style
元素本身匹配的模板,并调用TemplateB
。因此(除非TemplateB
明确地这样做)没有任何原因导致模板应用于Style
的孩子,因此Border
模板永远不会触发。
我想要由TemplateA处理的Style / Border元素以及TemplateB处理的Style下的所有其他内容
在这种情况下,您的模板应该是
<xsl:template priority="10"
match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style/Border" >
<xsl:call-template name="TemplateA"/>
</xsl:template>
<xsl:template priority="5"
match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style/*" >
<xsl:call-template name="TemplateB"/>
</xsl:template>
(我使用了明确的优先级,因为这两个规则都适用于Border
元素且它们具有相同的default priority)
您可以缩短匹配表达式,例如match="Style/*"
- 您不需要完整路径,因为其他地方没有其他可能会混淆事物的样式元素。
但更简单的方法就是删除call-template
并将match
表达式直接放在TemplateA
和TemplateB
上 - 模板可以同时拥有name
}和match
<xsl:template match="Style/Border" name="TemplateA" priority="10">
<!-- content of template A -->
</xsl:template>
<xsl:template match="Style/*" name="TemplateB" priority="5">
<!-- content of template B -->
</xsl:template>
答案 1 :(得分:1)
使用互斥匹配语句:
<xsl:template match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style/Border" >
<xsl:call-template name="TemplateA"/>
</xsl:template>
<xsl:template match="Chart/ChartAreas/ChartArea/ChartValueAxes/ChartAxis/Style/*[not(self::Border])]" >
<xsl:call-template name="TemplateB"/>
</xsl:template>