Найти значение узла и создать новый узел в XML, используя XSLT - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу изменить существующий файл XML с помощью XSLT. Исходный XML-файл

<?xml version="1.0" encoding="UTF-8"?>
<entry>
    <object>
        <items>
            <item>
                <name>John Doe</name>    <!-- Changed tag to closing tag -->
                <public-url>http://www.johndoe.com</public-url>
            </item>
        </items>
        <records>
            <record>
                <person>
                    <field name="book">
                        <text>A book</text>
                        <links>
                            <link>http://www.acook.com</link>
                        </links>
                    </field>
                </person>
            </record>
        </records>
    </object>
</entry>

Теперь я хочу использовать XSL, чтобы получить информацию о пользователе от <item> и вставить новый узел <field> в <person>. Окончательный результат будет выглядеть следующим образом.

<?xml version="1.0" encoding="UTF-8"?>
<entry>
    <object>
        <items>
            <item>
                <name>John Doe<name>
                <public-url>http://www.johndoe.com</public-url>
            </item>
        </items>
        <records>
            <record>
                <person>
                    <field name="author">
                        <text>John Doe</text>
                        <links>
                            <link>http://www.johndoe.com</link>
                        </links>
                    </field>
                    <field name="book">
                        <text>A book</text>
                        <links>
                            <link>http://www.acook.com</link>
                        </links>
                    </field>
                </person>
            </record>
        </records>
    </object>
</entry>

Ниже моя попытка, я хочу получить значения <name> и <public-url> из <item> и стать двумя переменными. Создайте новый <field>, используя эти две переменные, и вставьте в <record>. В настоящее время я не могу найти способ вставить этот новый узел в правильное местоположение.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@* | node()">
    <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="item/">
    <xsl:variable name="username" select="@name" />
    <xsl:variable name="userurl" select="@public-url" />
    <xsl:copy-of select="."/>
    <field name="author">
    <text><xsl:value-of select="$username"/></text>
    <links>
         <link>
             <xsl:value-of select="$userurl" />
         </link>
    </links>
    </field>
</xsl:template>
</xsl:stylesheet>

Пожалуйста, советы, спасибо!

1 Ответ

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

Это должно сделать это.

<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="person">
    <xsl:element name="person">
        <xsl:element name="field">
            <xsl:attribute name="name">
                <xsl:text>author</xsl:text>
            </xsl:attribute>
            <xsl:element name="text">
                <xsl:value-of select="./ancestor::object/items/item/name"/>
            </xsl:element>
            <xsl:element name="links">
                <xsl:element name="link">
                    <xsl:value-of select="./ancestor::object/items/item/public-url"/>
                </xsl:element>
            </xsl:element>
        </xsl:element>
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...