私は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...の使用を避けようとしています。また、パフォーマンス上の理由から、2つの変換を実行することは避けたいと思います。ありがとう!