【问题标题】:xslt 1.0 - find unique values by several criteriasxslt 1.0 - 通过几个标准查找唯一值
【发布时间】:2016-03-14 08:39:02
【问题描述】:

我有以下输入 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>

我需要获取名称为“books”的所有元素的输出,这些元素被选中(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 解决方案不起作用。有什么建议吗?

我在上一个问题中寻求帮助,当只有一个元素具有选择值“真”时,建议的答案在上述输入 xml 中不起作用

xslt 1.0 - find unique values by several criteria

【问题讨论】:

  • 预期输出是什么? “按作者姓名选择和唯一”到底是什么意思?据我了解,您的 xml 中的所有元素都不符合这些标准:作者 A 不是唯一的,作者 B 和 C 未被选中,所以我希望输出为空,这正是您的 XSLT 提供的内容。

标签: xslt


【解决方案1】:

如 cmets 中所述,此处使用的技术是 Muenchian Grouping。起初它可能会让人不知所措,但它是一种非常有用的技术。

在您的情况下,您想查找作者“选定”的书籍,因此您可以像这样定义一个键:

<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>

【讨论】:

  • 非常感谢您的快速回答:)
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多