2015-05-19 85 views
0

我有一個下面的XML應該轉換爲「預期的輸出」(如下所述,但我不知道爲什麼節點屬性(ABC)不進來XML標記,但外界如何轉換XML使用XSLT和複製節點以及屬性

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<Node ID="ABC"> 
<Name>Name-ABC</Name> 
<Description>Desc-ABC</Description> 
</Node> 
</Root> 

XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:template match="Node"> 
<xsl:copy> 
<xsl:apply-templates select="node() | @*" /> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

電流輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ABC 
Name-ABC 
Desc-ABC 
</Node> 

期望輸出(屬性應該是內部的),我也並不需要複製這是不符合我所創建的模板的任何節點:

<?xml version="1.0" encoding="UTF-8"?> 
<Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="ABC"></Node> 

回答

0

如果你要複製的Node元素的屬性,然後添加模板<xsl:template match="Node/@*"><xsl:copy/></xsl:template>或確保在Node元素的模板中使用<xsl:copy-of select="@*"/>複製它們。目前還不清楚您想要如何處理子元素,如果您不希望它們被複制或輸出,請移除模板中的<xsl:apply-templates select="node()"/>

如果你只知道要複製到輸出,然後用

<xsl:template match="/"> 
    <xsl:apply-templates select="//Node"/> 
</xsl:template> 

開始您的樣式,然後用已經提出的建議該元素的名稱,即

<xsl:template match="Node/@*"><xsl:copy/></xsl:template> 

<xsl:template match="Node"> <xsl:copy> <xsl:apply-templates select="@*" /> </xsl:copy> </xsl:template> 

或者作爲這兩個模板的替代品,您可以使用01模板中的單個模板做

<xsl:template match="Node"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    </xsl:copy> 
</xsl:template> 
+0

好試了你的建議。它看起來像這樣<?xml version =「1.0」encoding =「UTF-8」?> 不包括屬性 – Geebee

+0

我建議添加一個帶有匹配模板'Node/@ *'的模板。您尚未添加模板,但更改了現有模板的匹配模式和內容。 –

+0

好吧,試過這樣做,輸出如預期<?xml version =「1.0」encoding =「UTF-8」?> 但現在我唯一的問題是額外的標籤信息也正在填充。例如,如果有另一個node1,那麼XSL將失敗:( – Geebee