XSLT 1.0 如何在可选元素之后更新或插入元素
XSLT 1.0 How to update or insert an element after an optional element
这类似于这个问题:XSLT-1.0: How to insert an element at a specific position with respect to the parent element,但那里的答案没有涵盖输入 XML
中缺少 tag3
的情况
我想在 XML 文档中插入或更新标签(比如 tag4),如下所示,除了 tag1、tag2、tag3、tag4 和 tag5 都是可选的。
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="d" />
<tag5 value="e" />
</Begin>
即以下是示例输入和输出
输入:
<Begin>
</Begin>
输出:
<Begin>
<tag4 value="updated" />
</Begin>
输入:
<Begin>
<tag4 value="d" />
</Begin>
输出:
<Begin>
<tag4 value="updated" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
更新
我还希望能够保留 Begin 或 tag4 元素上可能已经存在的任何属性,例如:
输入:
<Begin someAttribute="someValue">
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="d" someOtherAttribute="someOtherValue" />
<tag5 value="e" />
</Begin>
输出:
<Begin someAttribute="someValue">
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="updated" someOtherAttribute="someOtherValue" />
<tag5 value="e" />
</Begin>
尝试:
<xsl:template match="Begin">
<Begin>
<xsl:copy-of select="tag1 | tag2 | tag3"/>
<tag4 value="updated"/>
<xsl:copy-of select="tag5"/>
</Begin>
</xsl:template>
试一试...如果需要,在调试器中跟踪它以帮助您解决问题。
<xsl:template match="Begin">
<xsl:copy>
<!-- Apply any attributes for Begin. -->
<xsl:apply-templates select="@*"/>
<!-- Output the tag* nodes before tag4. -->
<xsl:apply-templates select="tag1|tag2|tag3"/>
<xsl:choose>
<!-- Is there already a tag4? -->
<xsl:when test="tag4">
<xsl:apply-templates select="tag4"/>
</xsl:when>
<xsl:otherwise>
<!-- Create tag4 -->
<tag4 value="updated"/>
</xsl:otherwise>
</xsl:choose>
<!-- Output the tag* nodes after tag4. -->
<xsl:apply-templates select="tag5"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag4">
<xsl:copy>
<xsl:attribute name="value">d</xsl:attribute>
<xsl:attribute name="someOtherAttribute">someOtherValue</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
这类似于这个问题:XSLT-1.0: How to insert an element at a specific position with respect to the parent element,但那里的答案没有涵盖输入 XML
中缺少tag3
的情况
我想在 XML 文档中插入或更新标签(比如 tag4),如下所示,除了 tag1、tag2、tag3、tag4 和 tag5 都是可选的。
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="d" />
<tag5 value="e" />
</Begin>
即以下是示例输入和输出
输入:
<Begin>
</Begin>
输出:
<Begin>
<tag4 value="updated" />
</Begin>
输入:
<Begin>
<tag4 value="d" />
</Begin>
输出:
<Begin>
<tag4 value="updated" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
输入:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag5 value="e" />
</Begin>
输出:
<Begin>
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="updated" />
<tag5 value="e" />
</Begin>
更新
我还希望能够保留 Begin 或 tag4 元素上可能已经存在的任何属性,例如:
输入:
<Begin someAttribute="someValue">
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="d" someOtherAttribute="someOtherValue" />
<tag5 value="e" />
</Begin>
输出:
<Begin someAttribute="someValue">
<tag1 value="a" />
<tag2 value="b" />
<tag3 value="c" />
<tag4 value="updated" someOtherAttribute="someOtherValue" />
<tag5 value="e" />
</Begin>
尝试:
<xsl:template match="Begin">
<Begin>
<xsl:copy-of select="tag1 | tag2 | tag3"/>
<tag4 value="updated"/>
<xsl:copy-of select="tag5"/>
</Begin>
</xsl:template>
试一试...如果需要,在调试器中跟踪它以帮助您解决问题。
<xsl:template match="Begin">
<xsl:copy>
<!-- Apply any attributes for Begin. -->
<xsl:apply-templates select="@*"/>
<!-- Output the tag* nodes before tag4. -->
<xsl:apply-templates select="tag1|tag2|tag3"/>
<xsl:choose>
<!-- Is there already a tag4? -->
<xsl:when test="tag4">
<xsl:apply-templates select="tag4"/>
</xsl:when>
<xsl:otherwise>
<!-- Create tag4 -->
<tag4 value="updated"/>
</xsl:otherwise>
</xsl:choose>
<!-- Output the tag* nodes after tag4. -->
<xsl:apply-templates select="tag5"/>
</xsl:copy>
</xsl:template>
<xsl:template match="tag4">
<xsl:copy>
<xsl:attribute name="value">d</xsl:attribute>
<xsl:attribute name="someOtherAttribute">someOtherValue</xsl:attribute>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>