I have an XML file that looks like this example:
我有一个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>
What I'm trying to do is create a release notes document that first sorts and finds all of the unique @field-value values of the elements that have the @field-name equal to "Release Version". There may be other elements that do not pertain to release version. Here is the output I'm looking for:
我要做的是创建一个发行说明文档,该文档首先排序并找到@ field-name等于“Release Version”的元素的所有唯一@ 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
I've read up a bunch about the "Muenchian" method and sorting and grouping, but I'm struggling with the fact that I have attributes I need to compare to. Most of the examples I've read discuss sorting on elements which seems much more intuitive. And I need to find and sort on multiple attributes, well, my head just starts to explode.
我已经阅读了一堆关于“Muenchian”方法以及排序和分组的内容,但我正在努力解决我需要比较的属性这一事实。我读过的大多数例子讨论了对元素进行排序,这些元素看起来更直观。我需要找到并排序多个属性,好吧,我的头开始爆炸。
I've come up with stylesheets that will give me ALL of the elements that have "Release Version" as the text using:
我想出了样式表,它会给我所有使用“Release Version”作为文本的元素:
<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"/>
But that gives them ALL to me, not just the unique ones. And then I haven't figured out how to get the 'event' element that has the release note I need to print.
但这给了我们所有人,而不仅仅是独特的。然后我还没弄明白如何获得具有我需要打印的发行说明的'event'元素。
When I've tried to use 'generate-id()', I only get ONE result, as I guess there is only ONE unique entry with my value to find:
当我尝试使用'generate-id()'时,我只得到一个结果,因为我猜我只有一个唯一的条目可以找到我的值:
<xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases', 'Release Version')[1])]">
1 个解决方案
#1
2
With your current key...
用你当前的钥匙......
<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/>
You would be grouping custom-field-value elements by field-name, which you would do if you wanted to find the distinct field-name values. However, you want to group by the field value attributes for 'Release Versions'. This means you need to define your key like so:
您可以按字段名称对自定义字段值元素进行分组,如果要查找不同的字段名称值,可以执行此操作。但是,您希望按“发行版本”的字段值属性进行分组。这意味着你需要像这样定义你的密钥:
<xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/>
With this key, you are matching only on custom-field-value where the field name is 'Release Version'. You can then use this to get the distinct field values attributes, like so:
使用此键,您只能匹配字段名称为“发布版本”的自定义字段值。然后,您可以使用它来获取不同的字段值属性,如下所示:
<xsl:apply-templates
select="defect/custom-field-value[@field-name='Release Version']
[generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]" />
Then to get your release notes for a given release version, you could then use the key again
然后,要获取给定发行版的发行说明,您可以再次使用该密钥
<xsl:apply-templates
select="key('keyMajorReleases', @field-value)
/following-sibling::event[@include-in-release-notes='yes']" />
Here is the full XSLT
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/>
<xsl:template match="/Data">
<ul>
<xsl:apply-templates select="defect/custom-field-value[@field-name='Release Version'][generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]"/>
</ul>
</xsl:template>
<xsl:template match="custom-field-value">
<li>Release Version: <xsl:value-of select="@field-value"/>
<ul>
<xsl:apply-templates select="key('keyMajorReleases', @field-value)/following-sibling::event[@include-in-release-notes='yes']"/>
</ul></li>
</xsl:template>
<xsl:template match="event">
<li>
<xsl:value-of select="notes"/>
</li>
</xsl:template>
</xsl:stylesheet>
When applied to your sample XML, the following is output
应用于示例XML时,将输出以下内容
<ul>
<li>Release Version: 1.0
<ul>
<li>This is a release note to include</li>
</ul>
</li>
<li>Release Version: 1.5
<ul>
<li>This is a release note to include for 1.5</li>
</ul>
</li>
</ul>
#1
2
With your current key...
用你当前的钥匙......
<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/>
You would be grouping custom-field-value elements by field-name, which you would do if you wanted to find the distinct field-name values. However, you want to group by the field value attributes for 'Release Versions'. This means you need to define your key like so:
您可以按字段名称对自定义字段值元素进行分组,如果要查找不同的字段名称值,可以执行此操作。但是,您希望按“发行版本”的字段值属性进行分组。这意味着你需要像这样定义你的密钥:
<xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/>
With this key, you are matching only on custom-field-value where the field name is 'Release Version'. You can then use this to get the distinct field values attributes, like so:
使用此键,您只能匹配字段名称为“发布版本”的自定义字段值。然后,您可以使用它来获取不同的字段值属性,如下所示:
<xsl:apply-templates
select="defect/custom-field-value[@field-name='Release Version']
[generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]" />
Then to get your release notes for a given release version, you could then use the key again
然后,要获取给定发行版的发行说明,您可以再次使用该密钥
<xsl:apply-templates
select="key('keyMajorReleases', @field-value)
/following-sibling::event[@include-in-release-notes='yes']" />
Here is the full XSLT
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/>
<xsl:template match="/Data">
<ul>
<xsl:apply-templates select="defect/custom-field-value[@field-name='Release Version'][generate-id()=generate-id(key('keyMajorReleases', @field-value)[1])]"/>
</ul>
</xsl:template>
<xsl:template match="custom-field-value">
<li>Release Version: <xsl:value-of select="@field-value"/>
<ul>
<xsl:apply-templates select="key('keyMajorReleases', @field-value)/following-sibling::event[@include-in-release-notes='yes']"/>
</ul></li>
</xsl:template>
<xsl:template match="event">
<li>
<xsl:value-of select="notes"/>
</li>
</xsl:template>
</xsl:stylesheet>
When applied to your sample XML, the following is output
应用于示例XML时,将输出以下内容
<ul>
<li>Release Version: 1.0
<ul>
<li>This is a release note to include</li>
</ul>
</li>
<li>Release Version: 1.5
<ul>
<li>This is a release note to include for 1.5</li>
</ul>
</li>
</ul>