XSLT - 创建一个应该包含唯一和排序数据的变量
Posted
技术标签:
【中文标题】XSLT - 创建一个应该包含唯一和排序数据的变量【英文标题】:XSLT - create a variable which should contain unique and sorted data 【发布时间】:2018-11-17 01:07:00 【问题描述】:我正在使用 XSLT 2.0 和 Apache FOP 进行 XSLT 转换。
我的任务是创建一个变量,该变量将包含来自以下 XML 结构的唯一且已排序的类别名称:
<equipment>
<E0132>
<category>1. First Aid</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E0132>
<E0133>
<category>1. First Aid</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E0133>
<E4122>
<category>3. Fire safety</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E4122>
<E4182>
<category>3. Fire safety</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E4182>
<E4622>
<category>2. Access control</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E4622>
<E5225>
<category>4. Recognition</category>
<description>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</description>
</E5225>
</equipment>
我目前的 XSL 代码是这样的:
<xsl:variable name="equipment">
<xsl:for-each select="//equipment/node()/category">
<xsl:sort select="." order="ascending" />
<xsl:value-of select="distinct-values(.)"/>
</xsl:for-each>
</xsl:variable>
它解决了排序部分,但似乎distinct-values()
函数不起作用,我有重复值。
我做错了什么?
【问题讨论】:
【参考方案1】:您需要将distinct-values
放在您的选择表达式周围
<xsl:for-each select="distinct-values(//equipment/node()/category)">
<xsl:sort select="." order="ascending" />
<xsl:value-of select="."/>
</xsl:for-each>
【讨论】:
你好,蒂姆。这就是答案。还有一个问题:据我了解,现在$equipment
变量将只包含来自每个category
节点的文本。是否也可以保留节点?
distinct-values
返回原子值。如果你想保留节点,你应该查看xsl:for-each-group
。
你能帮我举个例子吗?我尝试使用此代码,但这不是我所期望的:<xsl:variable name="equipment"> <xsl:for-each-group select="//equipment/node()" group-by="category"> <xsl:sort select="." order="ascending" /> <xsl:value-of select="."/> </xsl:for-each-group> </xsl:variable>
我建议对此提出一个全新的问题。在 cmets 中很难遵循代码。谢谢!
如果我编辑原始问题,然后您添加单独的答案怎么办?以上是关于XSLT - 创建一个应该包含唯一和排序数据的变量的主要内容,如果未能解决你的问题,请参考以下文章