XSLT:如何更改父标记名称和从XML文件中删除属性?

时间:2009-11-20 10:13:11

标签: xslt

我有一个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”。

4 个答案:

答案 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>