2

私はxpathクエリを持っています:

        <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 の子として返します。このクエリを満たす要素がない場合でも、$fbids は空の #documentfragment に設定されます。

これは私のコードを台無しにしますが、次のループは、一致する要素ごとに 1 回反復するのではなく、#documentfragment に対して 1 回実行されます。それだけです。これを強制的に素敵な element()* 型に戻すにはどうすればよいですか?

ありがとう!

4

2 に答える 2

2

XSLT 2.0の変数のデフォルトのタイプは、documentfragmentです。as要素のシーケンスにする場合は、属性を追加してシーケンスタイプを指定します。selectネストされたシーケンス要素ではなく、属性を使用することもできます。

<xsl:variable name="fbids" as="element()*" select="
            feature_relationship[type_id/cvterm[name='molec_deletes' or name='deletes']]
             /object_id/feature/feature_synonym/synonym_id/synonym/synonym_sgml"/>
于 2012-08-11T01:41:22.847 に答える
2
      <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>
于 2012-08-11T04:04:00.937 に答える