【问题标题】:XSLT - create a variable which should contain unique and sorted dataXSLT - 创建一个应该包含唯一和排序数据的变量
【发布时间】: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() 函数不起作用,我有重复值。

我做错了什么?

【问题讨论】:

    标签: sorting xslt unique


    【解决方案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 中很难遵循代码。谢谢!
    • 如果我编辑原始问题,然后您添加单独的答案怎么办?
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2019-05-31
    • 2021-06-13
    相关资源
    最近更新 更多