скопировать атрибуты узла в родительский узел - PullRequest
0 голосов
/ 08 сентября 2010

Я работаю с PHP5, и мне нужно преобразовать XML в следующую форму:

<section>
      <heading>
            <line absolutePage="4" page="2" num="35">A Heading</line>
      </heading>
      <subsection type="type1">
            <heading label="3">
                  <line absolutePage="4" page="2" num="36">A Subheading</line>
            </heading>
            <content/>
      </subsection>
</section>

На что-то вроде этого:

<section name="A Heading">
      <heading>
            <line absolutePage="4" page="2" num="35">A Heading</line>
      </heading>
      <subsection type="type1" label="3" name="A Subheading">
            <heading label="3">
                  <line absolutePage="4" page="2" num="36">A Subheading</line>
            </heading>
            <content/>
      </subsection>
</section>

Обратите внимание, что атрибут label был скопирован из атрибута заголовка в родительский элемент.

Также был добавлен текст элемента heading/line в качестве атрибута родительского узла heading.

1 Ответ

3 голосов
/ 08 сентября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="subsection">
        <subsection label="{heading/@label}" name="{heading/line}">
            <xsl:apply-templates select="@*|node()"/>
        </subsection>
    </xsl:template>
    <xsl:template match="section">
        <section name="{heading/line}">
            <xsl:apply-templates select="@*|node()"/>
        </section>
    </xsl:template>
</xsl:stylesheet>

Выход:

<section name="A Heading">
    <heading>
        <line absolutePage="4" page="2" num="35">A Heading</line>
    </heading>
    <subsection label="3" name="A Subheading" type="type1">
        <heading label="3">
            <line absolutePage="4" page="2" num="36">A Subheading</line>
        </heading>
        <content></content>
    </subsection>
</section>

Примечание : Если возможно использование буквальных элементов результата и шаблона значений атрибутов, используйте его. Это делает код компактным и быстрым. Если вам нужен более общий ответ, уточните, пожалуйста.

Редактировать : Пропущено section/@name. Конечно, если пустая строка section/@label вас не беспокоит, вы можете использовать section|subsection сопоставление с образцом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...