2011-09-13 94 views
1

我有下面的XML文檔:XSL應用模板所有元素

<root> 
    <object type="set"> 
     <name>Test1</name> 
     <object type="set"> 
      <name>Test11</name> 
      <object type="set"> 
       <name>Test111</name> 
      </object> 
     </object> 
    </object> 

    <object type="set"> 
     <name>Test2</name> 
     <object type="set"> 
      <name>Test22</name> 
     </object> 
    </object> 

    <object type="set"> 
     <name>Test3</name> 
    </object> 
</root> 

和以下XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
    <body> 
     <xsl:apply-templates/> 
    </body> 
</html> 
</xsl:template> 

<xsl:template match="//object[@type='set']"> 
    <p> 
      <xsl:value-of select="name"/> 
    </p> 
</xsl:template> 

</xsl:stylesheet> 

不知何故//對象[@類型= '設置']僅選擇首先(Test1,Test2,Test3)。但我想選擇所有元素(Test11,Test111,Test22)。

+0

問得好,+1。這將幫助您瞭解模板從不「單獨」實例化,並且應用模板的節點列表由相應的指令的'select'屬性確定。 –

回答

2

模板永遠不會「自己」實例化。

而是,模板僅應用於<xsl:apply-templates select="expression"/>指令中由expression指定的節點列表。

還要注意,

<xsl:template match="//object[@type='set']">

相當於;

<xsl:template match="object[@type='set']">

再次 - 模板犯規選擇比賽

一個解決這個問題的

用途:

<xsl:apply-templates select="//object[@type='set']"/> 

整個改造成爲

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
     <html> 
      <body> 
       <xsl:apply-templates select="//object[@type='set']"/> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="object[@type='set']"> 
     <p> 
      <xsl:value-of select="name"/> 
     </p> 
    </xsl:template> 
</xsl:stylesheet> 

並可以產生想要的,正確的結果

<html> 
    <body> 
     <p>Test1</p> 
     <p>Test11</p> 
     <p>Test111</p> 
     <p>Test2</p> 
     <p>Test22</p> 
     <p>Test3</p> 
    </body> 
</html> 
+0

謝謝。有效。 – huuerequer

+0

@ huuerequer:不客氣。 –

1

那麼,另外,我想說,你的xpath表達式確實匹配類型集的每個對象。

但是你必須付出注意,以確保類型爲「set」的元素「對象」可能包含另一種相同類型的元素。在你的轉換腳本中,你完全忽略了這個事實。

您只需複製屬性「名稱」的第一次出現的值並忽略它可能的子項。

一個可能的解決方案,你要解決的方式可能是:

<xsl:template match="//object[@type='set']"> 
<p> 
     <xsl:value-of select="name"/>  
</p> 
<xsl:for-each select=".//object[@type='set']"> 
<p>  
     <xsl:value-of select="name"/>      
</p> 
</xsl:for-each></xsl:template> 

相反,我寧願初始化您的XPath表達式的變量(節點集),把它作爲參數傳遞給corrosponding模板迭代通過每個通過它。

希望我能幫忙,apologyze我的英語不好:)

問候

+0

有趣。謝謝。 – huuerequer