我熟悉XSLT的基礎知識,但是我遇到了一個奇怪的情況,我似乎無法弄清楚。我很抱歉這麼久,但我會很感激你能提供的任何幫助。使用XSLT添加屬性,然後使用該新屬性進行排序
我對由我無法控制的軟件產品生成的XML進行轉換。產品導出如下所示的數據:
<header>
<data>
</data>
</header>
<transaction>
<B1_PG1 ts='1139977698718.75'><data></data></B1_PG1>
<B1_PG2 ts='1139977698718.76'><data></data></B1_PG2>
<B2_PG1 ts='1139977698718.77'><data></data></B2_PG1>
<B2_PG2 ts='1139977698718.78'><data></data></B2_PG2>
<B2_PG1 ts='1139977698718.79'><data></data></B2_PG1>
<B2_PG2 ts='1139977698718.80'><data></data></B2_PG2>
<B3_PG1 ts='1139977698718.81'><data></data></B3_PG1>
</transaction>
其中軟件產品按照接收它們的順序導出數據頁面。我需要將這些頁面按自定義順序排序,以便處理到另一個系統中。所以,我創建了一個查找的文件,看起來像這樣來定義我的自定義排序順序:
(PageSequences.xml)
<pages>
<page id="B2_PG1" sequence="1000" />
<page id="B2_PG2" sequence="1010" />
<page id="B3_PG1" sequence="2000" />
<page id="B1_PG1" sequence="3000" />
<page id="B1_PG2" sequence="3010" />
</pages>
我再根據元素名稱查找該序列,串聯,與時間戳,並使用以下XSLT注入的屬性到元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name='page-seqs' select='document("PageSequences.xml")/pages/page'/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="transaction">
<transaction>
<xsl:for-each select="child::node()">
<xsl:variable name='localname' select='local-name()'/>
<xsl:copy>
<xsl:attribute name="sequence">
<xsl:value-of select='$page-seqs[@id=$localname]/@sequence'/>-<xsl:value-of select='@ts'/>
</xsl:attribute>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@sequence" />
</xsl:apply-templates>
</xsl:copy>
</xsl:for-each>
</transaction>
</xsl:template>
</xsl:stylesheet>
我遇到的問題是,標籤似乎並不奏效。我希望以下內容:
<transaction>
<B2_PG1 ts='1139977698718.77' sequence='1000-1139977698718.77'><data></data></B2_PG1>
<B2_PG1 ts='1139977698718.79' sequence='1000-1139977698718.79'><data></data></B2_PG1>
<B2_PG2 ts='1139977698718.78' sequence='1010-1139977698718.78'><data></data></B2_PG2>
<B2_PG2 ts='1139977698718.80' sequence='1010-1139977698718.80'><data></data></B2_PG2>
<B3_PG1 ts='1139977698718.81' sequence='2000-1139977698718.81'><data></data></B3_PG1>
<B1_PG1 ts='1139977698718.75' sequence='3000-1139977698718.75'><data></data></B1_PG1>
<B1_PG2 ts='1139977698718.76' sequence='3010-1139977698718.76'><data></data></B1_PG2>
</transaction>
,但我發現:
<transaction>
<B1_PG1 ts='1139977698718.75' sequence='3000-1139977698718.75'><data></data></B1_PG1>
<B1_PG2 ts='1139977698718.76' sequence='3010-1139977698718.76'><data></data></B1_PG2>
<B2_PG1 ts='1139977698718.77' sequence='1000-1139977698718.77'><data></data></B2_PG1>
<B2_PG2 ts='1139977698718.78' sequence='1010-1139977698718.78'><data></data></B2_PG2>
<B2_PG1 ts='1139977698718.79' sequence='1000-1139977698718.79'><data></data></B2_PG1>
<B2_PG2 ts='1139977698718.80' sequence='1010-1139977698718.80'><data></data></B2_PG2>
<B3_PG1 ts='1139977698718.81' sequence='2000-1139977698718.81'><data></data></B3_PG1>
</transaction>
另外,請讓我知道,如果你認爲我在錯誤的方式接近這一點。我試圖避免使用java/c#/ perl/etc ...來保持轉換儘可能便攜。出於性能原因,我也想避免執行兩次轉換。謝謝!
這是完美的蒂姆,非常感謝。它允許我執行排序而不需要添加屬性所需的傳遞。它將允許對任何元素進行自定義排序。 – 2012-07-16 02:13:26