2016-04-05 17 views
0

私はXMLとXSLTファイルからXHTMLを作成しようとしています。要素の2つの値がセルをマージした場合、XSLT?

2つ以上のXML要素の値がテーブル内の他の要素と一致するかどうかをテストしたい場合、そのセルを結果のXHTMLファイルにマージする必要があります。

簡潔にするために、単純なw3schoolsの例を使用します。 (より多くの人々がstackoverflowでこれを行う必要があります)。ここで

はXMLである:ここでは

<?xml version="1.0" encoding="UTF-8"?> 
<catalog> 
<cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
</cd> 
<cd> 
    <title>Empire Burlesque</title> 
    <artist>Bonnie Tyler</artist> 
</cd> 
<cd> 
    <title>Empire Burlesque</title> 
    <artist>Mr G</artist> 
</cd> 
<cd> 
    <title>Greatest Hits</title> 
    <artist>Dolly Parton</artist> 
</cd> 
</catalog> 

はXSLTです:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<html> 
<body> 
<h2>My CD Collection</h2> 
<table border="1"> 
<tr bgcolor="#9acd32"> 
    <th>Title</th> 
    <th>Artist</th> 
</tr> 
<xsl:for-each select="catalog/cd"> 
<tr> 
    <xsl:choose> 
    <xsl:when test="count(title) %gr 2"> 
    <td rowspan="2"><xsl:value-of select="title"/></td> 
    </xsl:when> 
    <xsl:otherwise> 
    <td><xsl:value-of select="title"/></td> 
    </xsl:otherwise> 
    </xsl:choose> 
    <td><xsl:value-of select="artist"/></td> 
    </tr> 
    </xsl:for-each> 
    </table> 
    </body> 
    </html> 
    </xsl:template> 
    </xsl:stylesheet> 

間違っているXSLTでの2つの要素がある:TESTとROWSPAN。

  1. タイトルに複数のインスタンスがあるかどうかをテストするにはどうすればよいですか? (この場合はエンパイア・バーレスクで)

    私は

3 ROWSPAN NOTEで(その出力はエンパイア・バーレスクを言う一つのセルである)、その場合には、これら二つのセルをマージするプログラムに伝えるにはどうすればよい

  • :テスト= 'エンパイア・バーレスク'を私に教えてください。私はどこにそれらを追加する場合は、他の繰り返しのインスタンスのために働くしたい。ありがとう。

  • +0

    を試してみてくださいだろう見るために(2.0ではかなり簡単です!)そのため、ターゲットとするバージョンを教えてください。 –

    答えて

    0
    私はあなたが=「エンパイア・バーレスク」のテストを行うことを教えてくれませんが、私はあなたの cd要素が別個 title

    によってグループにあなたをできるようになります Muenchian Groupingと呼ばれるXSLT 1.0の技術で、上に読むことを教えてくれます

    あなたのケースでは

    、あなたはそれぞれ個別のタイトルの最初の発生とcdの要素を取得するには、むしろ個別のタイトル(またはを取得するために、そして、タイトル

    <xsl:key name="cds" match="cd" use="title" /> 
    

    でCDを検索するキーを定義することから始め)、この式を使用します

    <xsl:for-each select="catalog/cd[generate-id() = generate-id(key('cds', title)[1])]"> 
    

    このループの中で、キーを使って一致するタイトルのすべてのCDを取得します。たとえば、あなたがROWSPANを必要に応じて、あなたはこの

    <xsl:if test="count(key('cds', title)) > 1"> 
    

    はこのようなグループ化の問題を解決するには、あなたがXSLT 1.0または2.0を使用しているかどうかに非常に強く依存し、このXSLT

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
    
    <xsl:key name="cds" match="cd" use="title" /> 
    
    <xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CD Collection</h2> 
    <table border="1"> 
    <tr bgcolor="#9acd32"> 
        <th>Title</th> 
        <th>Artist</th> 
    </tr> 
    <xsl:for-each select="catalog/cd[generate-id() = generate-id(key('cds', title)[1])]"> 
    <tr> 
        <td> 
         <xsl:if test="key('cds', title)[2]"> 
          <xsl:attribute name="rowspan"> 
           <xsl:value-of select="count(key('cds', title))" /> 
          </xsl:attribute> 
         </xsl:if> 
         <xsl:value-of select="title"/> 
        </td> 
        <td><xsl:value-of select="artist"/></td> 
    </tr> 
    <xsl:for-each select="key('cds', title)[position() > 1]"> 
    <tr> 
        <td> 
         <xsl:value-of select="artist"/> 
        </td> 
    </tr>  
    </xsl:for-each> 
        </xsl:for-each> 
        </table> 
        </body> 
        </html> 
    </xsl:template> 
    </xsl:stylesheet> 
    
    +0

    それは動作します、速い返答をありがとう。しかし、私は別のCDを追加して帝国のバーレスクとも呼ばれ、動作を停止しました。それを作るための簡単な方法はありますか?これは2つ以上の繰り返し要素のために機能しますか? – MrG

    +0

    少し厄介かもしれませんが、あなたの質問を編集して3つの "Empire burlesque" CDの例とあなたが期待する出力を表示できますか?ありがとうございました! –

    +0

    完了、私は帝国のバーレスクと呼ばれる別のCDを追加しました。今度は似たような結果が欲しいです:今回は、エンパイア・バーレスクが3列に並んでいて、アーティストBob Dylan、Bonnie Tyler、Mr G – MrG

    関連する問題