我有一个XML文件,我需要从中删除一个名为“Id”的属性(必须在任何地方删除它),我还需要重命名父标记,同时保持其属性和子元素不变。你能帮我修改代码吗?一次,我只能实现两个要求中的一个。我的意思是我可以完全从文档中删除该属性,或者我可以更改父标记.. 这是我的代码,删除属性“Id”:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Id[parent::*]">
</xsl:template>
请帮我将父标签名称从“Root”更改为“Batch”。
答案 0 :(得分:5)
所提供的解决方案都没有真正解决问题:它们只是重命名名为“Root”的元素(甚至只是顶部元素),而不验证此元素是否具有“Id”属性。
wwerner最接近正确的解决方案,但重命名父级的父级。
以下是具有以下属性的解决方案:
以下是代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="vRep" select="'Batch'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Id"/>
<xsl:template match="*[@Id]">
<xsl:element name="{$vRep}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:2)
我会尝试:
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Id">
</xsl:template>
<xsl:template match="/Root">
<Batch>
<xsl:apply-templates select="@*|node()"/>
</Batch>
</xsl:template>
第一个块会在您使用时复制未指定的所有内容。
第二个替代@id
,无论发生在何处都没有。
第三个将/Root
重命名为/Batch
。
答案 2 :(得分:2)
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()|text()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Id" />
<xsl:template match="Root">
<Batch>
<xsl:copy-of select="@*|*|text()" />
</Batch>
</xsl:template>
答案 3 :(得分:2)
这应该做的工作:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()|text()" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()[node()/@Id]">
<batch>
<xsl:apply-templates select='@*|*|text()' />
</batch>
</xsl:template>
<xsl:template match="@Id">
</xsl:template>
</xsl:stylesheet>
我使用以下XML输入进行了测试:
<root anotherAttribute="1">
<a Id="1"/>
<a Id="2"/>
<a Id="3" anotherAttribute="1">
<b Id="4"/>
<b Id="5"/>
</a>