xslt 1.0 - 通过几个标准查找唯一值

时间:2016-03-14 08:39:03

标签: xslt

我有以下输入XML:

<library>
<elements>
    <element name="books">
        <property name="author">A</property>
        <property name="select">false</property>
    </element>
    <element name="books">
        <property name="author">B</property>
        <property name="select">false</property>
    </element>  
    <element name="books">
        <property name="author">C</property>
        <property name="select">false</property>
    </element>  
    <element name="books">
        <property name="author">A</property>
        <property name="select">true</property>
    </element>  
</elements>
</library>

我需要输出所有元素的名称=&#34; books&#34;,这些元素被选中(selected = true)并且按作者名称唯一。必须使用xslt 1.0。

xsl解决方案:

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

 <xsl:template match="/">           
   <ul> 
     <xsl:for-each select="//elements/element[@name = 'books' and property[@name = 'select' and .='true'] ]/property[@name = 'author' and not(.=preceding::*)]">
      <li>
       <xsl:value-of select="concat('author :',.)"/>
      </li>   
     </xsl:for-each>            
    </ul>
  </xsl:template>
</xsl:stylesheet>

XSLT解决方案无效。有什么建议吗?

我在上一个问题中寻求帮助,当只有一个元素有选择值&#39; true&#39;

xslt 1.0 - find unique values by several criteria

1 个答案:

答案 0 :(得分:1)

如评论中所述,此处使用的技术是Muenchian Grouping。一开始它看起来很难,但它是一种非常有用的技术。

在您的情况下,您想要查找&#34;已选择&#34;他们的作者的书籍,所以你会定义一个如此的键:

<xsl:key name="book" match="element[property[@name='select'] = 'true']" use="property[@name='author']" />

然后,要获得不同的作者,请查看所有element元素,并选择在给定作者的密钥中首先出现的元素。执行此操作的表达式如下:

<xsl:for-each select="elements/element[generate-id() = generate-id(key('book', property[@name='author'])[1])]">

试试这个XSLT

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

    <xsl:key name="book" match="element[property[@name='select'] = 'true']" use="property[@name='author']" />

    <xsl:template match="library">
      <ul>
        <xsl:for-each select="elements/element[generate-id() = generate-id(key('book', property[@name='author'])[1])]">
            <li><xsl:value-of select="property[@name='author']" /></li>
        </xsl:for-each>
      </ul>
    </xsl:template>
</xsl:stylesheet>