2015-05-19 84 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