XSLT - заменить повторяющиеся части XML-документа (на любом уровне) - PullRequest
1 голос
/ 06 февраля 2011

профи, Мне нужно преобразовать тег «B» с тегом «X» в следующем документе:

<a>
 <B marker="true">
  <c>
    <B marker="true">
      <d>
        <B marker="true">
        </B>
       <d>
    </B>
  </c>
 </B>
</a>

Обратите внимание на повторяющееся 'B', оно может появляться на любой глубине в динамическом XML. Вот что я сделал:

<xsl:template match="//*[@marker='true']">
    <X>
        <xsl:copy-of select="./node()"/>
    </X>
</xsl:template>

Он работал для самого верхнего тега 'B', но игнорировал все вложенные.

Мне кажется, я знаю, в чем проблема - «копия» просто сбрасывает содержимое самого верхнего тега «В», не оценивая его. Что я могу сделать, чтобы «копия» переоценила мой шаблон?

Спасибо! Барух.

1 Ответ

7 голосов
/ 06 февраля 2011

Я бы пошел с преобразованием идентичности.

Этот код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="B[@marker = 'true']">
        <X>
            <xsl:apply-templates/>
        </X>
    </xsl:template>
</xsl:stylesheet>

Против этого ввода XML:

<a>
    <B marker="true">
        <c test="test">
            testText
            <B marker="true">
                <d>
                    testText2
                    <B marker="true">
                        testText3
                    </B>
                </d>
            </B>
            testText4
        </c>
        testText5
    </B>
</a>

Обеспечит этот правильный результат:

<a>
    <X>
        <c test="test">
            testText
            <X>
                <d>
                    testText2
                    <X>
                        testText3
                    </X>
                </d></X>
            testText4
        </c>
        testText5
    </X>
</a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...