XSLT добавить узел, если узел не существует, добавить ребенка, если он существует
У меня есть следующий 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 ответ
Решение
<?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>