Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > XML, XSL > resultXML из двух XML (правильно пройти по узлам)


Автор: Andy_L20066 14.1.2011, 14:05
привет

вообщем немного заплутался я из хsl, опыта работы с функциями мало. Вообщем такая задача: 
эсть xml1:
Код

<accommodations>
<accommodation>
     <acco_id>8888N</acco_id> 
     <name>Qwerty</name>
     <offcial_rating/>
</accommodation>

<accommodation>
     <acco_id>5555A</acco_id> 
     <name>Qwerty2</name>
     <offcial_rating />
</accommodation>
<accommodations>


имеется xml2:
Код

<root>
  <test date="24/12/2010">
    <codeTo>5555A</codeTo>
    <catalogCode>NV</catalogCode>
  </test>
  <test date="25/12/2010">
    <codeTo>8888N</codeTo>
    <catalogCode>LI</catalogCode>
  </test>
  <test date="26/12/2010">
    <codeTo>9999V</codeTo>
    <catalogCode>LL</catalogCode>
  </test>
</root>


вообщем на основе этих двух нужно сделать еще один xml:
Код

<results>
<result matching="yes" date="24/12/2010"> 
<!--matching="yes"если  елемент codeTo из xml2 равен елементу acco_id из xml1, иначе matсhing="no"  -->
<!--date устанавливается если matching='yes' и берется соответсвенно (из елементов где codeTo=acco_id) из xml2; если matching="no", то атрибут date должен отсутсвовать  -->
<result>
</results>


теперь то что я делаю из xsl:
Код

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:param name="file2" select="'target/test-classes/test2.xml'" />
    <xsl:variable name="file2Doc" select="document($file2)" />
    <xsl:template match="/">
        <xsl:element name="results">
            <xsl:for-each select="accommodations/accommodation">
                <xsl:element name="result">
                    <xsl:variable name="accoCode" select="acco_id" />                        
                    <xsl:attribute name="matching">
                    <xsl:for-each select="$file2Doc/root/test/codeTo">
                                <xsl:variable name="codeTo" select="." />
                                <xsl:variable name="EXPRESSION"    select=".[fn:compare(fn:upper-case($codeTo), fn:upper-case($accoCode)) = 0]" />
                                <xsl:choose>
                                    <xsl:when test="$EXPRESSION">
                                        <xsl:value-of select="'yes'" />
                                    </xsl:when>
                                </xsl:choose>
                        </xsl:for-each>
                    </xsl:attribute>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>


1) какими средставами атрибуту matching проставлять "yes" либо "no" ... "yes" в данном случае проставляется, но "no" уже наверное как то после трансформации... надо еще раз по документу бежать...
2) вообщем неуверен как правильно сделать так чтоб во время трансформации можно было бы проверять значение атрибута matching и сетать значение date? (я сетнул атрибут matching, как потом при создании атрибута date проверить значение matching)

заранее спасибо

Автор: diadiavova 16.1.2011, 20:21
По какому принципу ты сравниваешь элементы codeTo и acco_id: все со всеми, или по порядку следования в документе(первый с первым, второй со вторым и т. д.)? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)