別のスレッドに答える(stackoverflow:cssカラースキームの生成を参照)私は以下の問題にぶつかりました。そこでは、異なるxslエンジンが、結果ツリーフラグメントをノードセットに変換する際に異なるアプローチを必要とするようです。
問題を単純化するために(ただし、この背後にある完全なストーリーについては上記のリンクを参照してください)、色の値のリストを含むインラインツリーが必要です。これはXpath式で使用する必要があるため、MSXML xx xslエンジン専用のノードセットを作成する必要がありました(XML Spy組み込みでは、rtfとして構築された変数を含むXpath式の解釈に問題がありませんでした)。
さらに別のスレッドスタックオーバーフロー:automating-exsltnode-setが私を助けてくれました。結果のノードセットは、入力XMLから新しい変数rtfを作成する際に使用されます。
繰り返しになりますが、MSXMLはXpath式で新しい変数が使用されると文句を言うので、node-set関数を使用してそこからノードセットを作成しました。
これまでのところ良好であり、MSXMLxxはエラーを発生しなくなりました。
しかし、XMLSpyビルトインまたはSaxon9heで同じものを実行すると、別のエラーが発生します。ノードセット関数が不明であるようです。
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set() in variable colorList
この特定の例では、この2段階のアプローチは必要ありませんが、前述したように、物事を単純化したことに注意してください。すべてのxslエンジンで機能するXSLT1.0変換を作成する方法を知りたいだけです。
私が使用したXSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:std="http://whatever"
xmlns:exslt="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="std exslt">
<xsl:output method="xml" indent="yes"/>
<std:colors>
<color>#0000FF</color>
<color>#FF0000</color>
</std:colors>
<xsl:variable name="colors" select="document('')/*/std:colors"/>
<xsl:variable name="std:colorList">
<xsl:for-each select="//testid">
<xsl:variable name="pos" select="position() mod 2"/>
<xsl:element name="color">
<xsl:attribute name="testid"><xsl:value-of select="."/></xsl:attribute>
<xsl:value-of select="$colors/color[$pos + 1]"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="colorList" select="exslt:node-set($std:colorList)"/>
<xsl:template match="/">
<output>
<xsl:copy-of select="$colorList/color"/>
</output>
</xsl:template>
</xsl:stylesheet>
入力ファイル:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<defects>
<testid>111</testid>
</defects>
<defects>
<testid>999</testid>
</defects>
</NewDataSet>
MSXML 3.0 / 4.0 /6.0の結果:
<?xml version="1.0" encoding="UTF-16"?>
<output>
<color testid="111">#FF0000</color>
<color testid="999">#0000FF</color>
</output>
Saxon9heの結果:
Cannot find a matching 1-argument function named {urn:schemas-microsoft-com:xslt}node-set()
in variable colorList
結果として、XMLSpy組み込みxslエンジンになります。
Error in XPath expression
Unknown function - Name and number of arguments do not match any function signature in the static context - 'urn:schemas-microsoft-com:xslt:node-set'