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>