2017-09-15 34 views
0

環境: XSLT 1.0爲什麼XSLT變換不期望的輸出

預期輸出:兩者Level1和Level2文本輸出

:僅用於第2級元件

實際輸出的文本節點

XSL

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

    <xsl:output method="text"/> 

    <xsl:template match="/*"> 
    <xsl:apply-templates select="/data/section1" /> 
    </xsl:template> 

    <xsl:template match="level2"> 
    <xsl:value-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

XML

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="SelectingAndMatching.xslt"?> 

<data> 
    <section1> 
    <level1>hello world 1</level1> 
    <level2>unlocked achievement level 2</level2> 
    </section1> 
    <section2> 
    <product1></product1> 
    <product2></product2> 
    <product3></product3> 
    </section2> 
</data> 

回答

2

處理開始於文檔節點/你有沒有模板,以便用於其built-in template的其中一個確實<xsl:apply-templates/>,即處理所有子節點而你的情況是data元素由您的模板match="/*"匹配,其中處理/data/section1您沒有模板,所以使用內置的<xsl:apply-templates/>,即處理所有子節點section1,其中包括level1元素,您有模板,所以內置是用於處理所有子節點,對於那些文本節點再次沒有模板,內置文本節點將它們複製到輸出。

+0

SECTION1有Level1和Level2的元素,雖然我只希望level2的 – Rod

+0

所以,或許我的選擇應該是這樣的:'選擇=「/數據/ SECTION1/Level2的」' – Rod

+1

是,在簡單的情況下,你已經有了' ''最好把它改成''。另一個解決方案是確保'level1'元素不會產生任何輸出。 ''。 –