<xsl:variable name="fbids">
<xsl:sequence select="
feature_relationship[type_id/cvterm[name='molec_deletes' or name='deletes']]
/object_id/feature/feature_synonym/synonym_id/synonym/synonym_sgml"/>
</xsl:variable>
このクエリは、一致するノードのシーケンスをシーケンス自体として返すのではなく、単一の #documentfragment の子として返します。
はい、変数の本体内にシーケンスがあり、変数に型が指定されていないためです。このような場合のデフォルトのタイプは次のとおりdocument-node()
です。
解決策:
select
本体なしで変数を指定し、の属性にXPath 式を指定しますxsl:variable
。
<xsl:variable name="fbids" select="
feature_relationship[type_id/cvterm[name='molec_deletes' or name='deletes']]
/object_id/feature/feature_synonym/synonym_id/synonym/synonym_sgml"/>
as
属性を使用して必要な変数の型を指定することは、依然として良い方法です。
完全な回答は、変数の値 (要素のシーケンス) がその本体内で動的に作成される場合もカバーする必要があります。
ここでも、変数の型を指定することが解決の鍵です。
小さくて完全な例を次に示します。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="vMapped" as="element()*">
<xsl:for-each select="num">
<num><xsl:value-of select=".*2"/></num>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="$vMapped">
<xsl:sequence select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
この変換が次の XML ドキュメントに適用される場合:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
名前付き変数$vMapped
は、その本体内で動的に作成された値を取得します。コードの残りの部分では、この変数を要素のシーケンスとして正常に使用しています。このシーケンスの各要素にアクセスして、出力にコピーします。
<num>2</num>
<num>4</num>
<num>6</num>
<num>8</num>
<num>10</num>
<num>12</num>
<num>14</num>
<num>16</num>
<num>18</num>
<num>20</num>