Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XSLT][XML] Połączenie z dwóch plików
Forum PHP.pl > Forum > XML, AJAX
vokiel
Witam!
Przeszukałem cały dział, ale niestety nie znalazłem sposobu na swój problem.
Mam 2 pliki xml. Przetwarzam pierwszy przy pomocy xslt, przy tym w jednym miejscu pobieram z drugiego wartość jednego znacznika.
Na (uproszczonym) przykładzie:
1.xml
  1. <Products>
  2.      <Product>
  3.            <ProductId>C0010036</ProductId>
  4.            <PartNumber>005940</PartNumber>
  5.            <ProductName><![CDATA[TF1 bateria do tel. Sony-Ericsson K750i/D750i 850mAh Li-Pol V800/K600i/K608i]]></ProductName>
  6.            <ProductDescription><![CDATA[]]></ProductDescription>
  7.            <MajorGroup>TF1</MajorGroup>
  8.            <MinorGroup>ACG</MinorGroup>
  9.            <ProducerId>TELFORCE1</ProducerId>
  10.            <Price>16.3800</Price>
  11.            <PriceVat>19.9836</PriceVat>
  12.            <CurrencyId>PLN</CurrencyId>
  13.            <Available>0</Available>
  14.      </Product>
  15.      <Product>
  16.      [...]
  17.      </Product>
  18. </Products>

2.xml
  1. <HierarchyElement>
  2.      <HID>11311</HID>
  3.      <Name>Notebooki / Laptopy</Name>
  4.      <SortId>1</SortId>
  5.      <ParentHID>11272</ParentHID>
  6.      <ParentName>Komputery </ParentName>
  7.      <ParentSortId>0</ParentSortId>
  8.      <ShowLink>1</ShowLink>
  9.      <MinorGroup>PCN</MinorGroup>
  10. </HierarchyElement>
  11. <HierarchyElement>
  12. [...]
  13. </HierarchyElement>

mam plik xslt:
1.xslt
  1. <xsl:template match="/doc:PriceListProducts">
  2.      <xsl:for-each select="doc:Products/doc:Product">
  3.            <xsl:variable name="my_cat"><xsl:value-of select="doc:MinorGroup"/></xsl:variable>
  4.            <item>
  5.                  <vendor><xsl:value-of select="doc:ProducerId"/></vendor>
  6.                  <compid><xsl:value-of select="doc:ProductId"/></compid>
  7.                  <desc><xsl:value-of select="doc:ProductName"/></desc>
  8.                  <price><xsl:value-of select="doc:PriceVat"/></price>
  9.                  <catid><xsl:value-of select="PriceList/HierarchyElement[MinorGroup=$my_cat]/Name"/></catid>
  10.            </item>
  11.      </xsl:for-each>
  12. </xsl:template>


I teraz pointa:
Problem tkwi w pobraniu nazwy kategorii z drugiego pliku xml.
Do zmiennej my_cat przypisuje kod MinorGroup dla aktualnego węzła, i teraz jak pobrać odpowiadającą mu nazwę z drugiego pliku xml?

Proszę o pomoc
SirZooro
Dostęp do innego dokumentu XML zapewnia funkcja document(), czyli musisz użyć czegoś w tym stylu:
  1. <xsl:value-of select="document('2.xml')//MinorGroup[text()=$my_cat]/../Name" />


Zainteresuj się też możliwościami jakie daje funkcja XSLTProcessor::registerPHPFunctions
vokiel
Niestety pliki są przerabiane w javie sad.gif
Może da się to zrobić używając konstrukcji case tylko nie bardzo wiem jak tu się odwołać do drugiego pliku...
SirZooro
W Javie też powinno dać się użyć funkcję document() w XSLT. Przejrzyj wyniki z Googla dla zapytania java xslt - już pierwszy z nich wygląda ciekawie (ten ze strony oreilly). Przejrzałem to pobieżnie i wygląda że powinno się dać to zrobić, jedynie musisz dostarczyć instancję klasy URIResolver.
vokiel
Ponieważ był spory problem z połączeniem dwóch plików xml w jednym xslt postanowiłem połączyć je w javie, tworząc jeden plik xml. Także plik 1.xml i 2.xml jest teraz jednym plikiem.

Tylko teraz nie wiem jak pobrać tą nazwę kategorii
  1. <xsl:template match="/doc:PriceListProducts">
  2.     <xsl:for-each select="doc:Products/doc:Product">
  3.           <xsl:variable name="my_cat"><xsl:value-of select="doc:MinorGroup"/></xsl:variable>
  4.           <item>
  5.                 <vendor><xsl:value-of select="doc:ProducerId"/></vendor>
  6.                 <compid><xsl:value-of select="doc:ProductId"/></compid>
  7.                 <desc><xsl:value-of select="doc:ProductName"/></desc>
  8.                 <price><xsl:value-of select="doc:PriceVat"/></price>
  9.                 <xsl:template match="/doc:PriceListByTypesCustom">
  10.                                  <xsl:apply-templates select="doc:PriceList/doc:HierarchyElement[MinorGroup=$my_cat]"/>
  11.                                  <categoryId><xsl:value-of  select="doc:Name"/></categoryId>
  12.                 </xsl:template>
  13.           </item>
  14.     </xsl:for-each>
  15. </xsl:template>


to za bardzo nie chce działać sad.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.