XSLT复制XML文件,更改一个属性的值

时间:2017-12-19 22:23:39

标签: xml xslt saxon xslt-3.0 tei

注意:使用更新的代码进行编辑,产生名称空间的新问题。

使用XSLT 3.0和Saxon HE,我复制XML文档并复制它,我需要在元素@n中增加属性<div type="foo" n="0300">的值。在这种情况下,我想将@n增加1.这是当前代码:

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

<xsl:template match="//tei:div[@type='foo']">
   <div type="foo">
        <xsl:attribute name="n">
            <xsl:value-of select="format-number(@n + 1,'0000')"/>
        </xsl:attribute>
   </div type>
</xsl:template>

它应该产生:

<div type="foo" n="0002"/>

而是产生以下内容:

<div xmlns="" xmlns:ntei="http://www.example.org/ns/nonTEI" type="foo" n="0301"/>

我正在使用TEI命名空间。如何防止添加这些属性:xmlns="" xmlns:ntei="http://www.example.org/ns/nonTEI"

2 个答案:

答案 0 :(得分:3)

此XML文档,

<div type="foo" n="0300"/>

输入此XSLT 3.0转换时,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="3.0">

  <xsl:output indent="yes"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="@n">
    <xsl:attribute name="n">
        <xsl:value-of select="format-number(. + 1,'0000')"/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

将产生此输出XML文档,

<div type="foo" n="0301"/>

按要求。

答案 1 :(得分:1)

<xsl:template match="div[@type='foo']">
    <div type='foo'>
        <xsl:attribute name="n"><xsl:value-of select="format-number(@n + 1,'0000')"/></xsl:attribute>
    </div>
</xsl:template>