我有一个以下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>
答案 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>