1

我有一个这样的 XML:

<state>
    <current>block</current>
    <next>air</next>
</state>
<state>
    <current>air</current>
    <next>block</next>
</state>
<state>
    <current>air</current>
    <next>swim</next>
</state>
<state>
    <current>block</current>
    <next>air</next>
</state>

所以我想将所有“当前”+“下一个”元素分组以区分我可以遇到的每个当前和下一个(使用 XSLT 1.0)

air
block
swim

我已经使用 muenchina 方法对“当前”元素或“下一个”元素进行分组,但不能同时分组。

我该如何进行?

4

2 回答 2

1

好的,事实上它比我预期的要简单。

我简单地放了一个:

<xsl:key name="groups" match="//current|//next" use="." />

然后使用它:

<xsl:template match="current|next" mode="node" >
    <xsl:if test="generate-id() = generate-id(key('groups', normalize-space(.)))">
        <xsl:value-of select="."/>
    </xsl:if>
</xsl:template>
于 2013-07-03T14:25:08.200 回答
0

只需应用排序查询并输出唯一的查询:

<xsl:variable name="states">
    <xsl:value-of select="//state/*[contains(name(), 'current next')]/text()"/>
</xsl:variable>

<xsl:for-each select="str:tokenize($states)">
    <xsl:sort select="text()"/>
    <xsl:if test="preceding-sibling::*/text() != text()">
        <xsl:element name="state"><xsl:value-of select="text()"/></xsl:element>
    </xsl:if>
</xsl:for-each>

这是一个更新,其中包含一个使用 exsl 节点集的示例,用于不支持标记化的 xslt 实现:

<xsl:variable name="states">
    <xsl:for-each select="//state/*[contains(name(), 'current next')]">
    <xsl:element name="state">
        <xsl:value-of select="text()"/>
    </xsl:element>
</xsl:variable>

<xsl:for-each select="exsl:node-set($states)/*">
    <xsl:sort select="text()"/>
    <xsl:if test="preceding-sibling::*/text() != text()">
        <xsl:element name="state"><xsl:value-of select="text()"/></xsl:element>
    </xsl:if>
</xsl:for-each>

XSLT 是否可以跨多个级别对节点集进行排序也值得一看。我原本预计这不会起作用,但现在不太确定,因为我想知道 libxsl 是否会首先展平节点集。如果没有,则前面的兄弟:: 引用将失败,因为它只会引用直接节点,而不是选择中的一个:

<xsl:for-each select="//state/*[contains(name(), 'current next')]">
    <xsl:sort select="text()"/>
    <xsl:if test="preceding-sibling::*/text() != text()">
        <xsl:element name="state"><xsl:value-of select="text()"/></xsl:element>
    </xsl:if>
</xsl:for-each>
于 2013-07-03T10:19:15.837 回答