在xslt中如何将字符串值与包含多个值的另一个变量进行比较

时间:2014-01-13 13:46:50

标签: xslt

我有以下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>

但我得到重复的值。有人可以帮帮我吗?

2 个答案:

答案 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"/>