2013-07-03 42 views
1

多个元素我有一个这样的XML:组通过与XSL

<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方法。

我该怎么办?

回答

1

好吧,其实它比我的预期simplier。

我简单地说了:

<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> 
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> 
+0

看来,令牌化()是XSLT 2.0功能,我使用XSLT 1.0 – Rems

+0

创建exsl节点集,而是迭代节点。你需要一个例子吗? – Craig

+0

会很好,我不知道如何使用这个功能。 – Rems