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 你能帮我举个例子吗?我尝试使用此代码,但这不是我所期望的:&lt;xsl:variable name="equipment"&gt; &lt;xsl:for-each-group select="//equipment/node()" group-by="category"&gt; &lt;xsl:sort select="." order="ascending" /&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:for-each-group&gt; &lt;/xsl:variable&gt; 我建议对此提出一个全新的问题。在 cmets 中很难遵循代码。谢谢! 如果我编辑原始问题,然后您添加单独的答案怎么办?

以上是关于XSLT - 创建一个应该包含唯一和排序数据的变量的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:使用输入 XML 中的唯一且已排序的日期创建新的 XML 节点

XSLT 2.0 按另一个样式表中的变量排序

如何在 XSLT 1.0 中获取具有唯一数字的数字?

XSLT:如何将一个元素解析为多个变量

使用 xslt 创建语言选择器

XslCompiledTransform 中的 XSLT 复制和排序转换引发异常