复制节点并更改其内容

时间:2014-03-20 09:10:05

标签: xml xslt transformation

我有点想要在xml文件上进行转换。

基本上我正在尝试复制所有xml,但更改了一些只能以此开头的标签

XML代码:

<test alt="foo" title="bar"/>

传递xsl之后我想得到什么:

<test alt="foo"/>

<change alt="foo" title=""/>

事实上,有时我得到了很多属性的标签,所以我不想进行模板匹配,然后手动更改每个属性。

其实我这样做:

<xsl:template match="test">
    <change><xsl:apply-templates select="@*|node()"/></change>
</xsl:template>

<xsl:template match="test/@title">
    <xsl:attribute name="title">
        <xsl:value-of select=""/>
    </xsl:attribute>
</xsl:template>

但它并没有改变输出中的标题内容。

2 个答案:

答案 0 :(得分:2)

对于所有此类任务,您应该从身份转换模板

开始
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

然后为需要特殊处理的节点添加模板,例如

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="test/@title"/>

会复制所有内容,但会删除title元素的所有test属性。

或者

    <xsl:template match="@* | node()">
      <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
      </xsl:copy>
    </xsl:template>

<xsl:template match="test">
    <change><xsl:apply-templates select="@*|node()"/></change>
</xsl:template>

<xsl:template match="test/@title">
    <xsl:attribute name="title"/>
</xsl:template>

应该实现你的第二个要求。如果您仍有问题,请发布最小但完整的样本,以便我们重现问题。

答案 1 :(得分:0)

要删除alt的任何属性,请使用带有例外的身份转换:

样式表(删除其他属性)

<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:template match="@*[name() != 'alt']"/>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<test alt="foo"/>

或者,要将除alt之外的所有属性的值设置为"",请使用:

样式表(将其他属性设为空)

<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:template match="test">
        <change>
            <xsl:apply-templates select="@*|node()"/>
        </change>
    </xsl:template>

    <xsl:template match="@*[name() != 'alt']">
        <xsl:attribute name="{name()}"/>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="utf-8"?>
<change alt="foo" title=""/>