Как изменить элемент XML на основе другого элемента в файле? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть документ XML, который выглядит следующим образом:

<outer>
    <item name="1"/>
    <item name="2"/>
    <item name="3"/>

    <map>
        <entry ref="1" a="foo"/>
        <entry ref="2" a="bar"/>
    </map>
</outer>

Я хочу удалить элемент map и сохранить атрибуты непосредственно в элементах item, чтобы результат выглядит примерно так:

<outer>
    <item name="1" a="foo"/>
    <item name="2" a="bar"/>
    <item name="3"/>
</outer>

Каким-то образом я думаю, что это возможно с рекурсивным XSLT-шаблоном, но я должен признать, что я совершенно невежественен.

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

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Или вы можете попробовать это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item">
        <xsl:variable name="name" select="@name"/>
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:if test="//entry[@ref=$name]/@a">
            <xsl:attribute name="a" select="//entry[@ref=$name]/@a"/>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="map"/>
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/gVhDDyA/6

0 голосов
/ 02 апреля 2020

Это не требует рекурсии.

Определите ключ:

<xsl:key name="K" match="entry" use="ref"/>

и затем выполните

<xsl:template match="item">
  <item name="{@name}" a="{key('K', @name)/@a}"/>
</xsl:template>
...