глобальное переименование каждого узла в документе XML - PullRequest
1 голос
/ 08 декабря 2011

Я хочу глобально переименовать каждый узел в элементе XML, добавив существующее имя с суффиксом.

Текущий XSLT, который я написал ниже, работает, но теряет значения элементов. Как мне сохранить значения?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="suffix" select="'_Ver1'"/>
<xsl:template match="node()">
    <xsl:element name="{concat(local-name(.), $suffix)}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Проверка узла node() соответствует любому типу узла (включая, но не ограничиваясь, узлы элемента). Следующая таблица стилей реализует стандартное преобразование идентичности для всех неэлементных узлов , с дополнительным шаблоном для переименования элементов :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="suffix" select="'_Ver1'"/>
    <xsl:template match="@*|node()[not(self::*)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{concat(local-name(.), $suffix)}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

Тестовый ввод:

<root>
    <test1 attr="t">test</test1>
    <test1>testing</test1>
    <test1>tested</test1>
    <test1>tester</test1>
</root>

Выход:

<root_Ver1>
    <test1_Ver1 attr="t">test</test1_Ver1>
    <test1_Ver1>testing</test1_Ver1>
    <test1_Ver1>tested</test1_Ver1>
    <test1_Ver1>tester</test1_Ver1>
</root_Ver1>
0 голосов
/ 08 декабря 2011

Это потому, что node() также включает текстовые узлы. Если у вашего входного XML были разрывы строк, вы, возможно, заметили такие элементы, как <_Ver1/> в ваших выходных данных.

Попробуйте что-то вроде этого:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:variable name="suffix" select="'_Ver1'"/>

  <xsl:template match="text()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{concat(name(.),$suffix)}">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Я добавил шаблон для text(), а также copy-of для любых атрибутов, которые могут быть в XML.

0 голосов
/ 08 декабря 2011

Попробуйте добавить |text() к выражению?

...