【问题标题】:XSLT grouping on repeating element namesXSLT 对重复元素名称进行分组
【发布时间】:2013-12-04 16:37:19
【问题描述】:

我有一个平面源结构,需要按以下条件分组:

元素 P2 可以在 P1 之后多次出现。直到下一次出现 P1 之前,P1 和所有以下 P2 元素都需要分组到“位置”结构中。 “位置”在下一个 P1 元素出现时重复。

来源示例:

    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>

结果应该是:

<Position>
    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
</Position>
<Position>
    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
</Position>
<Position>
    <P1><field1/><field2/></P1>
    <P2><field1/><field2/><field3/></P2>
    <P2><field1/><field2/><field3/></P2>
</Position>

我正在尝试使用轴跟随兄弟,但无法弄清楚如何选择所有 P2 元素到 P1 的下一次出现。或者我应该在这种情况下使用 xsl:key 吗?

【问题讨论】:

    标签: xslt grouping


    【解决方案1】:

    在 XSLT 2.0 中,for-each-group 是一个简单的问题:

    <xsl:for-each-group select="*" group-starting-with="P1">
      <Position>
        <xsl:copy-of select="current-group()" />
      </Position>
    </xsl:for-each-group>
    

    在 1.0 中我能想到的最有效的方法是定义一个键

    <xsl:key name="P2key" match="P2" use="generate-id(preceding-sibling::P1[1])" />
    

    将 P2 元素按其最近的 P1 分组。然后只处理 P1 元素并使用 key 拉出正确的 P2:

    <xsl:for-each select="P1">
      <Position>
        <xsl:copy-of select=". | key('P2key', generate-id())" />
      </Position>
    </xsl:for-each>
    

    (我个人会使用模板而不是for-each,但for-each 是一个更简单的示例)

    【讨论】:

    • 嗨,伊恩,这是您的好建议。我已经实现了你的想法,它非常适合我:-)
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多