Saya memiliki dua file XML yang ingin saya ubah menjadi HTML menggunakan satu file XSL. Di elements.xml saya memiliki bagian yang menggabungkan nilai dari file XML ini dengan id. Sekarang di file HTML saya, saya ingin menyajikan setiap <element> sebagai <div> terpisah di mana saya ingin membuat daftar nama efek yang ditautkan di <linkedId>. Saya berasumsi akan ada beberapa penggunaan variabel yang ekstensif tetapi saya tidak bisa mengatasinya.

Misalnya, output untuk elemen pertama akan terlihat seperti ini:

<div>
 <div><p>NAME2</p></div>
 <div><p>NAME1</p></div>
</div>

elements.xml

<elements>
  <listOfElements>
    <element>
      <id>ID-element-1</id>
      *some data*
    </element>
    <element>
      <id>ID-element-2</id>
      *some data*
    </element>
     (...)
 </listOfElements>
 <linkedIds>
   <linkedId>
     <idOfElement>ID-element-1</idOfElement>
     <idOfEffect>ID-effect-2</idOfEffect>
     <idOfEffect>ID-effect-1</idOfEffect>
   <linkedId>
   <linkedId>
     <idOfElement>ID-element-2</idOfElement>
     <idOfEffect>ID-effect-2</idOfEffect>
     <idOfEffect>ID-effect-4</idOfEffect>
     <idOfEffect>ID-effect-7</idOfEffect>
    <linkedId>
     (...)
 </linkedIds>
</elements>

efek.xml

<effects>
 <effect>
   <idEffect>ID-effect-1</idEffect>
   <name>NAME1</name>
 </effect>
   <effect>
   <idEffect>ID-effect-2</idEffect>
   <name>NAME2</name>
 </effect>
 <effect>
   <idEffect>ID-effect-4</idEffect>
   <name>NAME4</name>
 </effect>
 <effect>
   <idEffect>ID-effect-7</idEffect>
   <name>NAME7</name>
 </effect>
</effect>

transform.xsl

<xsl:template match="elements">
  <div>
    <xsl:for-each select="elements/element">
      <xsl:variable name="ElementID" select='linkedIds/linkedId/idOfElement'/>
      <xsl:apply-templates select="document('effects.xml')/effects"/>
      ???
    </xsl:for-each>
   </div>
</xsl:template>

<xsl:template match="effects">
    <xsl:for-each select="effects/effect">
     <div>
       <p><xsl:value-of select="name"/></p>
     </div>
    </xsl:for-each>
</xsl:template>
0
SuperM4n 18 Mei 2016, 22:24

1 menjawab

Jawaban Terbaik

Tentukan dua kunci

<xsl:key name="k1" match="linkedIds/linkedId" use="idOfElement"/>

<xsl:key name="k2" match="effect" use="idEffect"/>

Lalu di template yang cocok element gunakan itu

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:param name="effects-url" select="'test2016051804.xml'"/>   
    <xsl:variable name="effects-doc" select="document($effects-url)"/>

    <xsl:output method="html" indent="yes"/>

    <xsl:key name="k1" match="linkedIds/linkedId" use="idOfElement"/>

    <xsl:key name="k2" match="effect" use="idEffect"/>

    <xsl:template match="/">
        <html lang="en">
            <body>
                <xsl:apply-templates select="//element"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="elements/listOfElements/element">
        <div>
            <xsl:variable name="linkedIds" select="key('k1', id)"/>
            <xsl:for-each select="$effects-doc">
                <xsl:apply-templates select="key('k2', $linkedIds/idOfEffect)/name"/>
            </xsl:for-each>
            <!-- with XSLT 2.0 you can simply use
         <xsl:apply-templates select="key('k2', key('k1', id), $effects-doc)"/>
        for the above 4 lines
    -->
        </div>
    </xsl:template>

    <xsl:template match="effect/name">
        <div>
            <p>
                <xsl:value-of select="."/>
            </p>
        </div>
    </xsl:template>

</xsl:stylesheet>

Dengan begitu inputnya

<elements>
    <listOfElements>
        <element>
            <id>ID-element-1</id> *some data* </element>
        <element>
            <id>ID-element-2</id> *some data* </element>
    </listOfElements>
    <linkedIds>
        <linkedId>
            <idOfElement>ID-element-1</idOfElement>
            <idOfEffect>ID-effect-2</idOfEffect>
            <idOfEffect>ID-effect-1</idOfEffect>
        </linkedId>
        <linkedId>
            <idOfElement>ID-element-2</idOfElement>
            <idOfEffect>ID-effect-2</idOfEffect>
            <idOfEffect>ID-effect-4</idOfEffect>
            <idOfEffect>ID-effect-7</idOfEffect>
        </linkedId>
    </linkedIds>
</elements>

Dan (Anda dapat mengatur parameter effects-url di stylesheet sesuai kebutuhan untuk nama file Anda)

<effects>
    <effect>
        <idEffect>ID-effect-1</idEffect>
        <name>NAME1</name>
    </effect>
    <effect>
        <idEffect>ID-effect-2</idEffect>
        <name>NAME2</name>
    </effect>
    <effect>
        <idEffect>ID-effect-4</idEffect>
        <name>NAME4</name>
    </effect>
    <effect>
        <idEffect>ID-effect-7</idEffect>
        <name>NAME7</name>
    </effect>
</effects>

Diubah menjadi

<html lang="en">
   <body>
      <div>
         <div>
            <p>NAME1</p>
         </div>
         <div>
            <p>NAME2</p>
         </div>
      </div>
      <div>
         <div>
            <p>NAME2</p>
         </div>
         <div>
            <p>NAME4</p>
         </div>
         <div>
            <p>NAME7</p>
         </div>
      </div>
   </body>
</html>
1
Martin Honnen 19 Mei 2016, 12:09
Saya tidak yakin saya mengerti ini. Haruskah terlihat seperti ini? pastebin.com/90wMQiMm
 – 
SuperM4n
18 Mei 2016, 23:44
@SuperM4n, saya telah mengedit jawabannya dan memberikan lembar gaya XSLT 1.0 lengkap yang menunjukkan cara menggunakan dua kunci.
 – 
Martin Honnen
19 Mei 2016, 12:10
Terima kasih banyak atas usaha Anda, sekarang sangat jelas bagi saya cara kerjanya.
 – 
SuperM4n
19 Mei 2016, 16:34