2017-02-03 13 views
0

誤解を招くタイトルのため申し訳ありませんが、私はそれのためのより良い表現は分かりません。私は完全に異なるタイプのデータのために、出力XMLに2つの異なるメインセクションを提供するXSLを作成しようとしています。しかし、私はいつも、それぞれのテンプレート呼び出しで、両方のタイプのデータを取得します。私はあなたにこれを達成するためのヒントを教えてください。これらは私の成分である:出力をXSLで区切る

ソースXML

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <books> 
     <book>Xpages</book> 
     <book>XML</book> 
    </books> 

    <dvds> 
     <dvd>Star Wars</dvd> 
     <dvd>Prometheus</dvd> 
    </dvds> 
</root> 

XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:call-template name="books"/> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:call-template name="dvds"/> 
      </xsl:element> 
     </media> 
    </xsl:template> 

    <xsl:template name="books" match="books"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template name="dvds" match="dvds"> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="books/book" name="book"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template match="dvds/dvd" name="dvd"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

これは私が

<?xml version="1.0" encoding="UTF-8"?> 
<media> 
    <booklist> 
     Xpages 
     XML  
     Star Wars 
     Prometheus  
    </booklist> 
    <dvdlist> 
     Xpages 
     XML  
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 

得るものです。しかし、これは私が欲しいものである

<?xml version="1.0" encoding="UTF-8"?> 
<media> 
    <booklist> 
     Xpages 
     XML 
    </booklist> 
    <dvdlist> 
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 

ご覧のとおり、私の2つのリストは2倍になります。私は2つのテンプレートの中でapply-templatesを使うからだと思いますが、これを解決する方法が必要です。どんな助けでも大歓迎です!

答えて

1

まず、xsl:call-templateを実行しますが、<xsl:apply-templates />はすべてのノードを選択します。この時点では、ドキュメントノード上にまだ配置されています。 XSLTの組み込みテンプレートが適用され、最初にというノードが選択され、その後、テンプレートがないため、booksdvdsの両方のノードが選択されます。あなたがする必要がどのような

は、単にあなたが興味を持っているノードをターゲットである

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:apply-templates select="root/books" /> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:apply-templates select="root/dvds" /> 
      </xsl:element> 
     </media> 
    </xsl:template> 

    <xsl:template match="books/book" name="book"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 

    <xsl:template match="dvds/dvd" name="dvd"> 
     <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

ありがとう! appy-templatesにselect属性を持たせることもできませんでした。 –

1

一つの解決策は、このXSLテンプレートとなり、このXSLTを試してみてください:。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 

    <xsl:template match="/root"> 
     <media> 
      <xsl:element name="booklist"> 
       <xsl:apply-templates select="books/book" /> 
      </xsl:element> 
      <xsl:element name="dvdlist"> 
       <xsl:apply-templates select="dvds/dvd" /> 
      </xsl:element> 
     </media> 
    </xsl:template> 

    <xsl:template match="book"> 
     <xsl:text>&#xa;</xsl:text><xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="dvd"> 
     <xsl:text>&#xa;</xsl:text><xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

その出力は

<?xml version="1.0"?> 
<media><booklist> 
     Xpages 
     XML 
    </booklist> 
    <dvdlist> 
     Star Wars 
     Prometheus 
    </dvdlist> 
</media> 
+0

ありがとうございました - 私はあなたの答えをupvoted私はそれが以前だったので、他の1つを受け入れた;-) –

関連する問題