2012-02-28 71 views
2

我試圖複製一個xml文檔完整的屬性和節點。輸出不包含屬性。 fi.xml是輸入,test.xsl進行轉換(xsl需要一個模式)。謝謝。複製一個具有屬性的xml文檔

f1.xml 
<test attr="val"> 
    <subtest attr2="val2"/> 
</test> 

test.xsl 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <xsl:copy> 
     <xsl:apply-templates select="document('f1.xml')" mode="abc"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ | @* | node()" mode="abc"> 
    <xsl:copy> 
     <xsl:apply-templates mode="abc"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

output: 
<?xml version="1.0" encoding="UTF-8"?><test> 
    <subtest/> 
</test> 
+0

bretter的文檔節點的孩子適合的應用:你可能有興趣有兩種解決方案,比目前公認的答案更簡單,更標準。 – 2012-02-28 17:20:43

回答

2

該樣式表看起來很奇怪,但請嘗試更改xsl:apply-templates到:

<xsl:apply-templates mode="abc" select="@*|node()"/> 
+0

這樣做,謝謝。應用模板沒有選擇應該處理當前節點的所有孩子。哦,生活和學習。 – bretter 2012-02-28 16:25:31

+0

@佈雷特 - 你非常歡迎。請考慮通過點擊旁邊的複選標記來接受答案。 – 2012-02-28 16:27:44

4

最短的解決方案

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="document('f1.xml')"/> 
</xsl:template> 
</xsl:stylesheet> 

一個更靈活的解決方案,但更簡單(沒有模式)和更多標準

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates select= 
     "document('f1.xml')/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

說明:在identity ruledocument('f1.xml')

+0

對於原本由OP完成的方式+1。 – 2012-02-28 18:21:18

+0

@DevNull:不客氣。你找到並解釋了這個問題很好,+1。 – 2012-02-28 18:23:15

相關問題