我有一个类似于此示例的 XML 文件:
<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>
我要做的是创建一个发行说明文档,该文档首先对 @field-name 等于“发行版本”的元素的所有唯一 @field-value 值进行排序和查找。可能还有其他与发布版本无关的元素。这是我正在寻找的输出:
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"/>
但这给了我所有的东西,而不仅仅是独特的。然后我还没有弄清楚如何获取具有我需要打印的发行说明的“事件”元素。
当我尝试使用“generate-id()”时,我只得到一个结果,因为我猜只有一个具有我的值的唯一条目可以找到:
<xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases', 'Release Version')[1])]">