2013-01-04 100 views
2

我的方式XSLT處理器節點上得到一個混亂,假設我有一個XML文件是這樣的:XSLT默認模板混亂

<object> 
     <animal> 
       <man men="asd">man1</man> 
       <man>man2</man> 
       <man>man3</man> 
       <man>man4</man> 
       <cat>cat1</cat> 
       <cat>cat2</cat> 
       <cat>cat3</cat> 
       <cat>cat4</cat> 
     </animal> 
     <vehicule> 
       <car>car1</car> 
       <car>car2</car> 
       <car>car3</car> 
       <car>car4</car> 
     </vehicule> 
</object> 

當我有沒有任何模板匹配類似下面的XSLT,它返回所有文本節點,沒有屬性節點,這是確定

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
</xsl:stylesheet> 

但是,當我有一個類似下面,它不返回任何東西:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
     <xsl:template match="object"> 
     </xsl:template> 
</xsl:stylesheet> 

是否如果我有一個父節點的顯式模板,我應該有一個顯式模板的父節點的所有子節點?

回答

6

您所看到的僅僅是built-in rules的效果,它輸出節點的文本值並將模板應用於其所有子節點。

如果覆蓋內置模板,那麼您的模板會生效。你想apply內置規則的object所有兒童:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="object"> 
    <xsl:apply-templates select="*" /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

因此,是否如果我有一個父節點的模板,我應該有一個模板爲所有的子節點? – Noor

+1

@Noor不完全。 XSLT處理僅包括處理文檔的根節點,除此之外(除非模板建議處理器處理兒童)。子節點被空模板忽略。 – phihag

1

你在#2條規則是說什麼也不做,所以什麼也沒做。你需要在那裏寫點東西。見xsl:copyxsl:apply-templates

+0

但即使沒有任何內容,隱式內置規則是否不適用? – Noor

+0

@Noor號如果沒有匹配的*模板,則內置規則適用。*您編寫一個匹配的模板,其中的內容取決於您。 – EJP

0

http://cafeconleche.org/books/xmljava/chapters/ch17.html#d0e31297

正如其他人所說,XSLT默認模板規則,以這樣的方式,默認情況下,他們將與文檔的頂級節點,然後遞歸地處理每個子節點,所有定義通往底部的路。您的模板將覆蓋根節點的默認規則,並且沒有任何指示來對其執行任何操作,因此不會再進行任何操作。如果您改爲這樣:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
     <xsl:template match="object"> 
      <xsl:apply-templates /> 
     </xsl:template> 
</xsl:stylesheet> 

它會繼續使用默認規則向下處理。只要您按照自己的方式發送處理,您不一定需要執行特定的任何處理子節點的操作。