Как написать XSLT, чтобы взять элемент из элемента? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть xml как это;

<root>
    <a>
        <a1>value</a1>
        <a2>value</a2>
        <b>
            <b1>value</b1>
            <b2>value</b2>
        </b>
    </a>
</root>

Я просто хочу вынуть элемент b из элемента a; а это значит, мне нужен следующий результат xml.

<root>
    <a>
        <a1>value</a1>
        <a2>value</a2>
    </a>
    <b>
        <b1>value</b1>
        <b2>value</b2>
    </b>
</root>

Как лучше всего справиться с этим в XSLT?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Альтернативным способом достижения желаемого результата было бы наличие исключающего шаблона для соответствия b в a и явное добавление в нужном месте:

<?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="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="root">
        <xsl:element name="root">
            <xsl:apply-templates />
            <xsl:element name="b">
                <xsl:apply-templates select="a/b/*" />
            </xsl:element>
        </xsl:element>
    </xsl:template>

    <xsl:template match="a/b" />

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
0 голосов
/ 04 сентября 2018

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

<xsl:template match="//a">
    <xsl:copy>
        <xsl:apply-templates select="./*[not(local-name()='b')]"/>
    </xsl:copy>
    <xsl:apply-templates select="./b"/>
</xsl:template>

Обновление по комментариям

Если вы обрабатываете несколько подэлементов, вы можете работать так:

<xsl:template match="//a">
    <xsl:copy>
        <xsl:apply-templates select="./*[not(local-name()='b') and not(local-name()='c')]"/>
    </xsl:copy>
    <xsl:apply-templates select="./b"/>
    <xsl:apply-templates select="./c"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...