XSLT добавить узел, если узел не существует, добавить ребенка, если он существует - PullRequest
1 голос
/ 14 октября 2011

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

<root>
    <book>
        <element2 location="file.txt"/>
        <element3>
            <element3child/>
        </element3>
    </book>
    <book>
        <element2 location="difffile.txt"/>
    </book>
</root>

Мне нужно иметь возможность копировать все, но проверьте, не находимся ли мы в / root / book / element2 [@ location = 'whatfile']. Если мы здесь, нам нужно проверить, существует ли родственный элемент3, если его нет, мы добавляем <element3>. С другой стороны, если он уже существует, нам нужно перейти к его дочерним элементам, найти last() и добавить собственный элемент, скажем <element3child>.

До сих пор я придумал следующее. Но имейте в виду, что я новичок в XSLT и мне нужна помощь с синтаксисом и т. Д.

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="/root/book/element2[@location='file.txt']/../*/last()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <element3child/>
</xsl:template>

1 Ответ

1 голос
/ 14 октября 2011
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />

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

    <!--If an <element2> has an <element3> sibling, 
          then add <element3child> as the last child of <element3> -->
    <xsl:template match="/root/book[element2[@location='file.txt']]
                           /element3/*[position()=last()]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <element3child/>
    </xsl:template>

    <!--If the particular <element2> does not have an <element3> sibling, 
           then create one -->
    <xsl:template match="/root/book[not(element3)]
                           /element2[@location='file.txt']">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
        <element3/>
    </xsl:template>

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