XSLT-разделение на дочернем узле - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть следующий XML-код

<para>Lorem ipsum <link>dolor</link> sit amet</para>

, который я хочу преобразовать в

<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>

Другими словами: я хотел бы разбить элемент para в позиции, гдеЭлемент ссылки есть.Есть ли намеки?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="no"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="/*">
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="para/text()">
  <para><xsl:copy-of select="."/></para>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-документу :

<para>Lorem ipsum <link>dolor</link> sit amet</para>

создает искомое, правильный результат :

<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>

Обратите внимание :

  1. Использование правила идентификации дляКопировать каждый узел как есть.

  2. Переопределение правила идентификации с шаблонами для обработки только определенных узлов

  3. Максимальная простота и мощь , вытекающие из использования 1. и 2. выше.

0 голосов
/ 18 ноября 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()[1]"/>
        </xsl:copy>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="para">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[1]"/>
        </xsl:copy>
        <xsl:apply-templates select="link" mode="copy"/>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="para/link"/>
    <xsl:template match="para/link" mode="copy">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[1]"/>
        </xsl:copy>
        <para>
            <xsl:apply-templates select="following-sibling::node()[1]"/>
        </para>
    </xsl:template>
</xsl:stylesheet>

Выход:

<para>Lorem ipsum </para><link>dolor</link><para> sit amet</para>

Примечание : Мелкозернистый обход.

Редактировать : Компакт-код:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[1]"/>
        </xsl:copy>
        <xsl:apply-templates select="self::para/link" mode="copy"/>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>
    <xsl:template match="para/link"/>
    <xsl:template match="para/link" mode="copy">
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="node()[preceding-sibling::node()[1]
                                    /self::link/parent::para]">
        <para>
            <xsl:call-template name="identity"/>
        </para>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...