只是应用分类查询和输出那些独特:
<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>
看来,令牌化()是XSLT 2.0功能,我使用XSLT 1.0 – Rems
创建exsl节点集,而是迭代节点。你需要一个例子吗? – Craig
会很好,我不知道如何使用这个功能。 – Rems