2013-11-27 108 views
0

我有一個XML文檔:XSL模板匹配不工作

<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處理的樣式/ Border元素,和樣式下的TemplateB處理其他的一切。但是,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> 

回答

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> 
+0

感謝。兩人都有一種享受。 – user3041630

2

你的Style元素本身相匹配,並呼籲TemplateB的模板。因此(除非TemplateB明確這麼做)沒有任何事情導致模板應用於兒童Style,因此Border模板不會觸發。

我想TemplateA處理的樣式/ Border元素和樣式下的其他一切由TemplateB

處理,在這種情況下你的模板應該是

<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/*" - 你不需要完整的路徑,因爲在其他地方沒有其他Style元素可能會混淆事物。

但即使是簡單的將只是刪除call-template,換上TemplateATemplateBmatch表達直接 - 模板可以同時具有namematch

<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>