XSLT копировать XML-файл, изменить значение одного атрибута

Примечание: редактируется с обновленным кодом, создавая новые проблемы с пространствами имен.

Используя 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 ответа

Решение

Этот документ 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"/>

как просили.

<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>
Другие вопросы по тегам