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

XSLT copy XML file, change value of one attribute

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

使用 XSLT 3.0 和 Saxon HE,我正在复制一个 XML 文档,在复制它时我需要增加元素 <div type="foo" n="0300"> 中属性 @n 的值。在这种情况下,我想将 @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" ?

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

这个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"/>

根据要求。