XSLT 1.0 - 查找属性的不同组合

XSLT 1.0 - Find distinct combination of attributes

提问人:Sam 提问时间:10/10/2023 更新时间:10/10/2023 访问量:25

问:

我正在使用 XSLT 1.0,我想找到多个属性的不同组合,特别是 DATE、RUN 和 REPORT 组合:

<?xml version="1.0" encoding="utf-8"?>
<Report>
  <Rows>
    <Row DATE="2020-02-01" RUN="1" REPORT="1" OTHER="there are other attributes" />
    <Row DATE="2020-02-01" RUN="2" REPORT="1" OTHER="there are other attributes" />
    <Row DATE="2020-02-02" RUN="1" REPORT="2" OTHER="there are other attributes" />
    <Row DATE="2020-02-02" RUN="1" REPORT="2" OTHER="there are other attributes" />
    <Row DATE="2020-02-03" RUN="2" REPORT="1" OTHER="there are other attributes" />
    <Row DATE="2020-02-03" RUN="2" REPORT="1" OTHER="there are other attributes" />
    <Row DATE="2020-02-03" RUN="1" REPORT="1" OTHER="there are other attributes" />
    <Row DATE="2020-02-03" RUN="1" REPORT="1" OTHER="there are other attributes" />
  </Rows>
</Report>

我需要得到的是更像这样的东西:

DATE="2020-02-01" RUN="1" REPORT="1"
DATE="2020-02-01" RUN="2" REPORT="1"
DATE="2020-02-02" RUN="1" REPORT="2"
DATE="2020-02-03" RUN="2" REPORT="1"
DATE="2020-02-03" RUN="1" REPORT="1"

过去,我曾成功地使用测试进行单属性分组,这只是我第一次需要跨多个列进行测试。

<xsl:if test="not(preceding-sibling::Row[@RUN = current()/@RUN])">

我猜我需要一个类似键的东西,将属性连接在一起

<xsl:key name="comboKey" match="/Report/Rows/Row" use="concat(@DATE,'++',@RUN,'++',@REPORT)"/>

但是我就是无法理解 XSLT 1.0 中的模板匹配(很抱歉,菜鸟问题,我对 XSLT 1.0 不太熟悉,但我学得很快。

非常感谢您的任何建议!

XML 分组 XSLT-1.0 muenchian-grouping

评论


答:

1赞 y.arazim 10/10/2023 #1

您已正确标记您的问题,但与前面的兄弟姐妹进行比较不会尝试实现它。你应该这样做:Muenchian Grouping

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:key name="k1" match="Row" use="concat(@DATE, '|', @RUN, '|', @REPORT)" />

<xsl:template match="/Report">
    <distinct>
        <xsl:for-each select="Rows/Row[count(. | key('k1', concat(@DATE, '|', @RUN, '|', @REPORT))[1]) = 1]">
            <Row DATE="{@DATE}" RUN="{@RUN}" REPORT="{@REPORT}"/>
        </xsl:for-each>
    </distinct>
</xsl:template>

</xsl:stylesheet>

有关该方法的解释(以及为什么您的方法不是一个好的方法),请阅读:http://www.jenitennison.com/xslt/grouping/muenchian.html

评论

0赞 Sam 10/11/2023
谢谢!这也是一本有趣的读物。