使用XSLT有条件地插入元素?

时间:2014-01-29 22:27:44

标签: xml xslt xpath

我需要根据具有最大元素数量的兄弟节点在一个或多个节点中插入“占位符”元素。

这就是我所拥有的:

<main>
<program>
    <product>1</product>
    <product>2</product>
    <product>3</product>
</program>
<program>
    <product>1</product>
</program>

这就是我想要的:

<main>
<program>
    <product>1</product>
    <product>2</product>
    <product>3</product>
</program>
<program>
    <product>1</product>
    <product>dummy</product>
    <product>dummy</product>
</program>

如您所见,XLST应将两个虚拟元素插入第二个节点,因为兄弟节点有三个元素。如何使XSLT将虚拟元素插入到元素数量较少的节点中?

谢谢。

1 个答案:

答案 0 :(得分:2)

这应该是一个有效的XSLT 2.0解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:variable name="countMax" select="max(//program/count(product))" />

        <main>
            <xsl:for-each select="/main/program">
                <xsl:variable name="currentCount" select="count(./product)" />
                    <program>
                        <xsl:for-each select="./product">
                            <product><xsl:value-of select="." /></product>
                        </xsl:for-each>
                        <xsl:for-each select="$currentCount+1 to $countMax">
                            <product><xsl:text>dummy</xsl:text></product>
                        </xsl:for-each>
                    </program>
            </xsl:for-each>
        </main>
    </xsl:template>
</xsl:stylesheet>

但可能会有更好的答案。