2016-05-18 19 views
0

1つのXSLファイルを使用してHTMLに変換する2つのXMLファイルがあります。 elements.xmlには、これらのXMLファイルの値をIDで結合する部分があります。今私のHTMLファイルで、にリンクされているエフェクトの名前を一覧表示するために、<element>をすべて別の<div>として提示したいと思います。私は変数のいくつかの広範な使用があると仮定しますが、私はそれの周りに私の頭を得ることはできません。2つのXMLファイルの値をXSLTを使用してIDで結合する

例えば、最初の要素の出力は次のようになります

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

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

答えて

1

は入力

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

そのようにそれらを使用elementテンプレートマッチングでは、2つのキー

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

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

を定義しますと(自分のファイル名に、必要に応じてスタイルシートでパラメータeffects-urlを設定することができます)

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

は、私はこのことを理解していない

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

に変換されます。このように見えますか? http://pastebin.com/90wMQiMm – SuperM4n

+0

@ SuperM4n、私は答えを編集し、2つのキーの使い方を示す完全なXSLT 1.0スタイルシートを提供しました。 –

+0

どうもありがとうございました。どういう仕組みかとても分かりました。 – SuperM4n