XSL模板匹配不起作用

时间:2013-11-27 12:43:22

标签: xml xslt xpath

我有一个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>

2 个答案:

答案 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表达式直接放在TemplateATemplateB上 - 模板可以同时拥有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>