2017-02-14 65 views
1

我有以下XML:如何將XML項目列表排序爲HTML表格的行?

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

我想最終把它們放到一個HTML表(xy的座標,在該表中的細胞),並使其更容易我想把項目到行,像這樣:

<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

對不起,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或谷歌Muenchian分組。第一個基本上使用'key'來確保你只遍歷不同的y元素。 –