我有一个看起来像这个例子中的XML文件:XSLT排序和分组涉及属性
<Data>
<defect>
<record-id>1</record-id>
<custom-field-value field-name="Release Version" field-value="1.0"/>
<custom-field-value field-name="Other info" field-value=""/>
<custom-field-value field-name="More info" field-value="blah"/>
<event include-in-release-notes="yes">
<notes>This is a release note to include</notes>
</event>
<event include-in-release-notes="no">
<notes>This is not a release note</notes>
</event>
</defect>
<defect>
<record-id>2</record-id>
<custom-field-value field-name="Release Version" field-value="1.5"/>
<custom-field-value field-name="Other info" field-value=""/>
<custom-field-value field-name="More info" field-value="blah"/>
<event include-in-release-notes="yes">
<notes>This is a release note to include for 1.5</notes>
</event>
<event include-in-release-notes="no">
<notes>This is not a release note</notes>
</event>
</defect>
</Data>
我试图做的是创建一个发行说明文档,首先排序和查找所有独特的@具有@字段名称的元素的字段值值等于“发布版本”。可能还有其他与发布版本无关的元素。下面是输出我在寻找:
Release Version: 1.0
o This is a release note to include
Release Version: 1.5
o This is a release note to include for 1.5
Release Verison: x.x
o one release note
o another release note
我读了一堆关于“Muenchian”方法和排序和分组,但我的事实,我有属性,我需要努力相比于。我读过的大部分示例都讨论了对更直观的元素进行排序。我需要找到并分类多个属性,好吧,我的头刚刚开始爆炸。
我拿出样式表将使用给我所有具有“发行版本”的元素作为文本:
<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/>
<xsl:for-each select=key('keyMajorReleases', 'Release Version')">
<xsl:sort order="descending" data-type="text" select="@field-value"/>
但是,让他们在我身上,不只是唯一的个。然后,我还没有想出如何获得具有我需要打印的发行说明的'event'元素。
当我试图用“产生-ID()”,我只得到一个结果,因为我想只有一个与我的价值,唯一的入口发现:
<xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases', 'Release Version')[1])]">
蒂姆,感谢您的帮助!我没有意识到'key'和'select'中的语法用于指定一个等于某个值的特定属性。这是诀窍,再次感谢! – Gunn