如何在xslt中添加条件?

时间:2017-05-31 23:47:54

标签: xml xslt xslt-1.0 xslt-grouping

我正在尝试解析是xml

<a>
    <b Number="first">
        <c Over="1">
            <name>1</name>
        </c>
        <c Over="2">
            <name>2</name>
        </c>
    </b>
    <b Number="Second">
        <c Over="1">
            <name>3</name>
        </c>
        <c Over="2">
            <name>4</name>
        </c>
    </b>
</a>

使用分组概念

我喜欢这个

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
    <xsl:key name="node-by-over" match="c" use="@Over" />

    <xsl:template match="a">

        <xsl:apply-templates select="b[@Number='first']/c[generate-id() = generate-id(key('node-by-over', @Over)[1])]"/>

    </xsl:template>

    <xsl:template match="c">
        <table id="">

            <xsl:for-each select="key('node-by-over', @Over)">
                <tr>
                    <td>balls:::<xsl:value-of select="name"/></td>

                </tr>
            </xsl:for-each>
        </table>
    </xsl:template>

</xsl:stylesheet>

我的输出

<table><tr><td>balls:::1</td></tr><tr><td>balls:::3</td></tr></table><table><tr><td>balls:::2</td></tr><tr><td>balls:::4</td></tr></table>

预期

<table><tr><td>balls:::1</td></tr><tr><td>balls:::2</td></tr></table>

为什么它给出这样的输出1,3,2,4 ???我已经在applytemplate中使用了提及我需要@Number为c的所有first节点

<xsl:apply-templates select="b[@Number='first']/c[generate-id() = generate-id(key('node-by-over', @Over)[1])]"/>

预期输出1,2(解析名称)

1 个答案:

答案 0 :(得分:0)

您的预期输出表明您想要:

  • 仅列出每个组中的第一个c/name元素 (由Over属性分组),
  • 单个 <table>元素中。

(您应该在帖子中写上以上内容)。

因此,对脚本的重要更改归结为以下内容:

  • <table>移至match="a"模板。
  • 删除<xsl:for-each模板中的match="c"(以生成输出 只是当前组中的第一个元素。)

这是完整的脚本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes"/>
  <xsl:key name="node-by-over" match="c" use="@Over" />

  <xsl:template match="a">
    <table>
      <xsl:apply-templates select=
        "b[@Number='first']/c[generate-id() =
        generate-id(key('node-by-over', @Over)[1])]"/>
    </table>
  </xsl:template>

  <xsl:template match="c">
    <tr><td>balls:::<xsl:value-of select="name"/></td></tr>
  </xsl:template>
</xsl:stylesheet>

修改

实际上[@Number='first']中不需要select,因为分组只选择每个组中的第一个c/name元素(从整个文档中收集)。

或者,如果某些其他机制已经分组了元素(进入第一个第二个组,可能更多),然后整个分组基于key 不需要。 也许只需select="b[@Number='first']"即可。