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


person jbrehr    schedule 19.12.2017    source источник
comment
Пожалуйста, не меняйте вопрос после того, как на него был дан ответ. Для кого-то нового (вроде меня), который приходит и видит ответ, который касается только части вопроса, почти невозможно разобраться в том, что происходит. Если у вас есть проблема с пространствами имен, которая кажется совершенно не связанной с вашим исходным вопросом, задайте новый вопрос. (Но сначала ознакомьтесь с XSLT и пространствами имен, потому что об этом почти наверняка уже спрашивали и отвечали раньше).   -  person Michael Kay    schedule 20.12.2017


Ответы (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"/>

как просили.

person kjhughes    schedule 19.12.2017
comment
Работает отлично. Я удалил излишние объявления пространств имен, которые использовал, и это устранило другую «морщину» (ваш комментарий должным образом отмечен). Очень признателен! - person jbrehr; 20.12.2017

person    schedule
comment
@ mg-kedzie Это почти работает. Он дает следующее: ‹div xmlns = xmlns: ntei = example.org/ns/nonTEI type = registry_ordinal n = 0002 / ›. Я работаю в пространстве имен TEI. - person jbrehr; 20.12.2017