2012-08-10 341 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"/>