XSL for-each节点比较

3

I have an input 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>

我需要比较 /ResultSet1/set@uid 的每个元素,和 /ResultSet2/set@itemNumber 的每个元素。如果找到匹配项,我需要选择 /ResultSet2/set/item 的值。
3个回答

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

如果您的意思是在set1中找到一个与set2中的节点匹配的节点,则可以使用XPath进行构建。请参考http://www.w3.org/TR/xpath/#booleans

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

我还没有测试过它。


但是我的输出基本上是ResultSet1的for-each。因此,如果在其中使用这个逻辑,即:<xsl:for-each select="/ResultSet1"> <xsl:for-each select="../ResultSet2/set/item[../@itemNumber = /ResultSet1/set/@uid]"> ... </xsl:for-each> </xsl:for-each>我得到的是项目的连接,即<>item2item2</>。 - Arun
搞定了。使用了一个模板,并在其中使用了for-each和if。 - Arun
是的,它可能是在 xslt:if 中的一个 test。不知道上下文。 - Ludovic Kuty

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>

希望有所帮助 :)
如果有任何疑问,请告诉我。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接