如何使用XSLT转换XML并将节点与属性一起复制

时间:2015-05-19 17:04:44

标签: xslt

我有一个以下XML,它应该转换为"预期输出" (如下所述。但我不确定为什么节点属性(ABC)不会进入xml标签但在外面。

<?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>

1 个答案:

答案 0 :(得分:0)

如果您要复制Node元素的属性,请添加模板<xsl:template match="Node/@*"><xsl:copy/></xsl:template>,或确保在<xsl:copy-of select="@*"/>元素的模板中使用Node复制它们。目前尚不清楚您想要对子元素做什么,如果您不想复制或输出它们,请删除模板中的<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>

或作为这两个模板的替代方案,您可以使用单个模板执行Node

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