Сравнение XSL для каждого узла - PullRequest
3 голосов
/ 19 января 2012

У меня есть ввод 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@uid с for-each из /ResultSet2/set@itemNumber. Если совпадение найдено, мне нужно будет выбрать значение /ResultSet2/set/item

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Вот полное решение в стиле push (без <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 голос
/ 19 января 2012

Предполагаемый <root/> узел для входного 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>

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>

надеюсь, это помогло :)
Дай знать, если есть какие-либо вопросы

1 голос
/ 19 января 2012

Если вы имеете в виду, что найдено совпадение там, где в наборе set1 есть узел, который совпадает с узлом в наборе set2, то он встроен в XPath.ЧФР.http://www.w3.org/TR/xpath/#booleans

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

Я не проверял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...