2017-02-14 5 views
1

私は、次のXMLがあります(xyは、そのテーブル内のセルの座標である)私は最終的にHTMLテーブルに入れたいHTMLテーブルのXML項目のリストを行にソートするにはどうすればよいですか?

<items> 
    <item x="1" y="3"/> 
    <item x="2" y="4"/> 
    <item x="3" y="4"/> 
    <item x="4" y="2"/> 
    <item x="5" y="1"/> 
</items> 

をし、それが簡単に私が項目を入れたい作るために

<items> 
    <row y="1"> 
    <item x="1" y="1"/> 
    </row> 
    <row y="2"> 
    <item x="2" y="2"/> 
    </row> 
    <row y="3"> 
    <item x="5" y="3"/> 
    </row> 
    <row y="4"> 
    <item x="3" y="4"/> 
    <item x="4" y="4"/> 
    </row> 
</items> 

しかし、唯一、私は動作しませんが、また、私は、行番号と列に注釈を付けることはできませんだけでなく、思い付く変換:このような行に。

<xsl:template match="/items"> 
    <items> 
    <row> 
     <xsl:for-each select="item"> 
     <xsl:sort select="@y"/> 
     <xsl:sort select="@x"/> 

     <xsl:if test="preceding-sibling::item[1]/@y != @y"> 
      <xsl:text>"</row>"</xsl:text> 
      <xsl:text>"<row>"</xsl:text> 
     </xsl:if> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </row> 
    </items> 
</xsl:template> 

どのようにすればいいですか?

+0

XSLT 1.0または2.0? –

+0

Aah申し訳ありませんが、XSLT 1.0。私はそのタグを追加します。 – Fylke

答えて

2

投稿されたXSLTは無効です - 適切なプロセッサでは、無効なXMLになる可能性のある方法で、そのようなタグを開始および終了させることはできません。

あなたがグループにこれらを必要とする - あなたはXSLT 1.0を使用している場合、私はあなたの入力与えられたあなたの期待出力の意味を理解する方法が非常にわからないが、あなたは、そのようにグループ化Muenchianを使用することができます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="html" omit-xml-declaration="yes" indent="yes" /> 
    <xsl:key name="items-by-y" match="item" use="@y" /> 
    <xsl:template match="/items"> 
    <items> 
     <xsl:for-each select="item[count(. | key('items-by-y', @y)[1]) =1]"> 
     <xsl:sort select="@y" /> 
     <xsl:sort select="@x" /> 
     <row y="{@y}"> 
      <xsl:for-each select="key('items-by-y', @y)"> 
      <xsl:copy-of select="." /> 
      </xsl:for-each> 
     </row> 
     </xsl:for-each> 
    </items> 
    </xsl:template> 
</xsl:stylesheet> 
を中

結果:

<items> 
    <row y="1"> 
     <item x="5" y="1"/> 
    </row> 
    <row y="2"> 
     <item x="4" y="2"/> 
    </row> 
    <row y="3"> 
     <item x="1" y="3"/> 
    </row> 
    <row y="4"> 
     <item x="2" y="4"/> 
     <item x="3" y="4"/> 
    </row> 
</items> 

あなたがXSLT 2.0を使用している場合、あなたは<xsl:for-each-group>ような何かを行うことができ、より多くの情報のためHow to use for each group in XSLを参照してください。

+0

すごく感謝!各項目にはもっと多くの要素がありますが、最も関連性の高い情報だけを含めるために、これらの要素を省略しました。 – Fylke

+0

最初のfor-eachがどのように動作するのか分かりません。あなたはすべてのy要素を調べ、最初の要素をとり、結果を数えますか、または現在の要素(空の場合は?)を探します。これを説明できますか? – Fylke

+0

https://en.wikipedia.org/wiki/XSLT/Muenchian_groupingまたはGoogle Muenchianグループをご覧ください。最初のものは基本的に 'key'を使って、別個のy要素だけを反復していることを保証します。 –

関連する問題