【问题标题】:XSLT 1.0 Unique ElementsXSLT 1.0 独特元素
【发布时间】:2010-10-28 22:26:41
【问题描述】:

我正在尝试使用前兄弟从组中选择唯一元素。

以下面的xml为例..

<items>
 <item>
  <options>
   <option>
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
    <option-data>
     <data-ab>TEST2</date-qualifier>
     <date>20101026</date>
    </option-data>

   </option>
   <option type="2">
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
  </options>
 </item>
 <item>
  <options>
   <option>
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
   <option type="2">
    <option-data>
     <data-ab>TEST1</date-qualifier>
     <date>20101026</date>
    </option-data>
   </option>
  </options>
 </item>
</items>

我希望能够选择唯一的 option-date 元素(不同的是 date 和 data-ab)。我只想为每个项目选择唯一的选项数据/日期,即不是按选项。我使用了前兄弟的组合,但是当它返回给父级时,我只能保证每个选项的日期都是唯一的我逐项需要。

为此绞尽脑汁好几个小时,却想不出一个优雅的解决方案。

问候, 安迪

【问题讨论】:

  • 我认为您最好的选择是使用 Muenchian 分组...复合键,例如:&lt;xsl:key name="item-option-date" match="item/options/option/option-data" use="concat(generate-id(../../..), ':', date, ':', data-ab)" /&gt; 这不是一个完整的答案,但我必须回家吃晚饭。 ;-)
  • 我想另一个有用的澄清问题是,您需要如何查询/访问这些独特元素:(a) 所有元素的节点集(对于所有项目)? (b) 给定&lt;item&gt;,它独特的选项数据后代是什么? (c) 别的什么?当你说“选择唯一的选项数据元素”时,你的意思是你想省略 all 那些不是唯一的,还是你想选择每一个(即选择不同的) ?
  • 好问题,+1。请参阅我的答案以获得完整、高效和事实上的标准解决方案。 :)
  • 您的问题不清楚。首先I want to be able to select unique option-date elements (distinct is by date and data-ab):在您的示例中没有唯一的(它们都具有相同的键)。第二个问题I only want to select the option-data/date that is uniqueu for each item i.e not by option:这里也一样,都是同一个key。你想把它们分组吗?期望的输出是什么?

标签: xslt


【解决方案1】:

这种转变:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kODByVal" match="option-data"
  use="concat(generate-id(ancestor::item[1]), '+', data-ab, '+', date)"/>

  <xsl:template match="item">

  Unique option-data elements for item: <xsl:text/>
  <xsl:value-of select="concat(position(), '&#xA;')"/>

  <xsl:copy-of select=
  "*/*/option-data[generate-id()
                  =
                   generate-id(key('kODByVal',
                               concat(generate-id(current()), '+',
                                      data-ab,
                                      '+',
                                      date)
                               )[1])
                  ]
  "/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时(已更正以实现良好格式):

<items>
    <item>
        <options>
            <option>
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
                <option-data>
                    <data-ab>TEST2</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
            <option type="2">
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
        </options>
    </item>
    <item>
        <options>
            <option>
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
            <option type="2">
                <option-data>
                    <data-ab>TEST1</data-ab>
                    <date>20101026</date>
                </option-data>
            </option>
        </options>
    </item>
</items>

产生想要的正确结果

  Unique option-data elements for item: 1
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>
<option-data><data-ab>TEST2</data-ab><date>20101026</date></option-data>

  Unique option-data elements for item: 2
<option-data><data-ab>TEST1</data-ab><date>20101026</date></option-data>

注意:最有效的 XSLT 1.0 (Muenchian) 分组方法用于三个连接的键。

【讨论】:

  • +1 好答案。 (不同的选项数据元素,不一定是唯一的,IIUC。)
  • @LarsH:谢谢。我可能也被否决了,因为我是 0 ...?
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多