2012-01-19 4 views
3

У меня есть входной XML:XSL для каждого сравнения-узла

<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/[email protected] с for-each из /ResultSet2/[email protected]. Если совпадение найдено, тогда мне нужно будет выбрать значение /ResultSet2/set/item

ответ

1

<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> 

надеюсь, что это помог :)
lemme знаю, если есть вопросы

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> 

Я еще не протестировал его.

+0

Но мой вывод в основном для каждого из ResultSet1. Следовательно, если использовать эту логику внутри нее, то есть, ... Я получаю CONCAT пункта т.е. <> item2item2 – Arun

+0

Понял работать. Использовал шаблон и использовал for-each и if внутри него. – Arun

+0

Да, это может быть «тест» в 'xslt: if'. Не знал контекста. – lkuty

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>