2012-08-10 339 views
2

我有XPath查詢:如何選擇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。

這使我的代碼搞砸了,而下面的循環,而不是每個匹配的元素迭代一次,爲#documentfragment運行一次,就是這樣。我如何強制這個返回一個不錯的元素()*類型?

謝謝!

+2

XSLT 1或2?這個區域有很大的不同。哦,而且不會簡單地用''做這份工作嗎? – biziclop 2012-08-10 22:03:39

+0

XSLT 2,是的! – 2012-08-13 16:01:11

回答

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屬性的xsl:variable提供XPath表達式:

<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> 
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"/>