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