我有以下xml文件。我需要从中获取所有唯一的“所有者”值并执行一些操作。
<issues>
<issue>
<owner>12345</owner>
</issue>
<issue>
<owner>87654</owner>
</issue>
<issue>
<owner>12345</owner>
</issue>
</issues>
<tests>
<test>
<owner>34598</owner>
</test>
<test>
<owner>12345</owner>
</test>
<test>
<owner>34598</owner>
</test>
<test>
<owner>11111</owner>
</test>
</tests>
我尝试使用以下xslt脚本。
<xsl:for-each select="issues/issue[not(child::owner=preceding- sibling::issue/owner)]/owner">
<!--some code-->
</xsl:for-each>
<xsl:for-each select="tests/test[not(child::owner=preceding- sibling::test/owner)]/owner">
<xsl:variable name="IrmAs">
<xsl:value-of select="." />
</xsl:variable>
<xsl:variable name="IssueList">
<xsl:value-of select="//issues/issue/owner">
</xsl:variable>
<xsl:if test="not(contains($IssueList,$IrmAs))">
<!--some code-->
</xsl:if>
</xsl:for-each>
但我得到重复的值。有人可以帮帮我吗?
答案 0 :(得分:0)
在XSLT 2.0中,您只需使用for-each-group
:
<xsl:for-each-group select="issues/issue | tests/test" group-by="owner">
<!-- in here, . is the first issue/test with a given owner and current-group()
is the sequence of all issue/test elements that share the same owner -->
</xsl:for-each-group>
如果您遇到1.0,那么您需要使用一种称为“Muenchian分组”的技术 - 定义一个密钥,它将具有相同所有者的元素分组,然后使用每个组中的第一个项目进行处理一个generate-id
技巧
<xsl:key name="ownerKey" match="issue | test" use="owner" />
<xsl:for-each select="(issues/issue | tests/test)[generate-id()
= generate-id(key('ownerKey', owner)[1])]">
<!-- one iteration per unique owner, with . being the parent element of the
first occurrence -->
</xsl:for-each>
答案 1 :(得分:0)
但我得到了重复的值。
不太清楚 你得到重复的值 - 因为你发布的代码没有输出任何东西。如果你测试了类似的东西:
...
<xsl:for-each select="issues/issue[not(child::owner=preceding-sibling::issue/owner)]/owner">
<out>
<xsl:value-of select="." />
</out>
</xsl:for-each>
....
你会看到 工作(尽管效率低下)并返回:
...
<out>12345</out>
<out>87654</out>
...
同样,测试以下代码段:
...
<xsl:for-each select="tests/test[not(child::owner=preceding-sibling::test/owner)]/owner">
<xsl:variable name="IrmAs">
<xsl:value-of select="." />
</xsl:variable>
<xsl:variable name="IssueList">
<xsl:value-of select="//issues/issue/owner"/>
</xsl:variable>
<xsl:if test="not(contains($IssueList,$IrmAs))">
<out>
<xsl:value-of select="." />
</out>
</xsl:if>
</xsl:for-each>
...
产生
...
<out>34598</out>
<out>11111</out>
...
所以问题必须出在您尚未发布的代码部分。另请注意,您发布的代码有几个语法错误,例如:
<xsl:value-of select="//issues/issue/owner">
需要:
<xsl:value-of select="//issues/issue/owner"/>