gpt4 book ai didi

xslt - 如何选择xpath返回类型?

转载 作者:行者123 更新时间:2023-12-02 13:23:06 25 4
gpt4 key购买 nike

我有 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 运行一次,仅此而已。我如何强制它返回一个好的 element()* 类型?

谢谢!

最佳答案

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

This query does not return a sequence of matching nodes as a sequence itself, it returns them as children of a single #documentfragment.

是的,因为变量体内有一个序列,并且变量没有指定类型。这种情况下的默认类型是:document-node()

解决方案:

指定不带主体的变量,并在 xsl:variableselect 属性中提供 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>

关于xslt - 如何选择xpath返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11907719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com