XSL for-each节点比较

时间:2012-01-19 06:28:17

标签: xml xslt xpath

我有一个输入xml:

<ResultSet1>
     <set uid="80301707"/>
     <set uid="80301703"/>
     <set uid="80301705"/>
</ResultSet1>

<ResultSet2>
     <set itemNumber="80301707">
        <item>item2</item>
     </set>
     <set itemNumber="80301703">
        <item>item2</item>
     </set>
</ResultSet2>

我需要将for-each /ResultSet1/set@uidfor-each /ResultSet2/set@itemNumber进行比较。如果找到匹配,那么我需要选择/ResultSet2/set/item

的值

3 个答案:

答案 0 :(得分:3)

以下是完整的推送式解决方案(未使用<xsl:for-each>):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="ResultSet2/set[@itemNumber = /*/ResultSet1/set/@uid]">
     <xsl:copy-of select="*"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<root>
    <ResultSet1>
        <set uid="80301707"/>
        <set uid="80301703"/>
        <set uid="80301705"/>
    </ResultSet1>
    <ResultSet2>
        <set itemNumber="80301707">
            <item>item1</item>
        </set>
        <set itemNumber="80301703">
            <item>item2</item>
        </set>
        <set itemNumber="80301704">
            <item>item3</item>
        </set>
    </ResultSet2>
</root>

产生了想要的正确结果

<item>item1</item>
<item>item2</item>

答案 1 :(得分:1)

如果你的意思是找到匹配,其中set1中的节点与set2中的节点匹配,那么它将内置到XPath中。 (CFR)。 http://www.w3.org/TR/xpath/#booleans

<xsl:for-each select="/ResultSet2/set/item[../@itemNumber = /ResultSet1/set/@uid]">
...
</xsl:for-each>

我还没有测试过。

答案 2 :(得分:1)

假设输入XML的<root/>节点:)

<root>
  <ResultSet1>
    <set uid="80301707"/>
    <set uid="80301703"/>
    <set uid="80301705"/>
  </ResultSet1>

  <ResultSet2>
    <set itemNumber="80301707">
      <item>item1</item>
    </set>
    <set itemNumber="80301703">
      <item>item2</item>
    </set>
    <set itemNumber="80301704">
      <item>item3</item>
    </set>
  </ResultSet2>
</root>

XSLT代码:

  <xsl:template match="/root">
    <xsl:for-each select="ResultSet1">
      <xsl:for-each select="../ResultSet2/set[@itemNumber=//set/@uid]/item">
            <!--Do whatever you wish :) -->
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

对于当前的XSL代码:这将是输出:

<item>item1</item>
<item>item2</item>

希望它有所帮助:) lemme知道是否有任何疑问