xml – 涉及属性的XSLT排序和分组
我有一个
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等于“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 我已经阅读了一堆关于“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’元素. 当我尝试使用’generate-id()’时,我只得到一个结果,因为我猜我只有一个唯一的条目可以找到我的值: <xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases','Release Version')[1])]"> 解决方法
用你当前的钥匙……
<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/> 您可以按字段名称对自定义字段值元素进行分组,如果要查找不同的字段名称值,可以执行此操作.但是,您希望按“发行版本”的字段值属性进行分组.这意味着你需要像这样定义你的密钥: <xsl:key name="keyMajorReleases" match="custom-field-value[@field-name='Release Version']" use="@field-value"/> 使用此键,您只匹配自定义字段值,其中字段名称为“发布版本”.然后,您可以使用它来获取不同的字段值属性,如下所示: <xsl:apply-templates select="defect/custom-field-value[@field-name='Release Version'] [generate-id()=generate-id(key('keyMajorReleases',@field-value)[1])]" /> 然后,要获取给定发行版的发行说明,您可以再次使用该密钥 <xsl:apply-templates select="key('keyMajorReleases',@field-value) /following-sibling::event[@include-in-release-notes='yes']" /> 这是完整的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> 应用于示例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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |