小编Dav*_*d R的帖子

为什么 index-of() 在应用于一系列唯一节点时会返回多个值?

我正在使用 xpath2 的索引值来返回排序的节点序列中的 current() 索引。使用 SAXON,节点的排序序列是唯一的,但 index-of 返回两个值的序列。

这不会一直发生,只是偶尔发生,但我找不到任何原因。有人可以解释一下发生了什么吗?

我已经根据例程给出这种奇怪行为的数据示例编写了一个最小示例。

源数据为:

<data>
<student userID="1" userName="user1"/>
<session startedOn="01/16/2012 15:01:18">
</session>
<session startedOn="11/16/2011 13:31:33">
</session>
</data>
Run Code Online (Sandbox Code Playgroud)

我的 xsl 文档将会话节点放入根模板最顶部的排序序列 $orderd 中:

<xsl:template match="/">
<xsl:variable name="nodes" as="node()*" select="/data/session"></xsl:variable>
<xsl:variable name="orderd" as="node()*">
<xsl:for-each select="$nodes">
<xsl:sort select="xs:dateTime(xs:dateTime(concat(substring(normalize-space(@startedOn),7,4),'-',substring(normalize-space(@startedOn),1,2),'-',substring(normalize-space(@startedOn),4,2),'T',substring(normalize-space(@startedOn),12,8)))
)" order="ascending"/>
    <xsl:sequence select="."/>
</xsl:for-each>
</xsl:variable>
Run Code Online (Sandbox Code Playgroud)

由于节点已经由@startOn 排序,但顺序相反,序列 $orderd 应该与文档排序序列 $nodes 相同,但顺序相反。

当我使用 for-each 语句创建输出时,我发现在使用 index-of 测试时,这两个节点以某种方式被视为相同。

下面的代码用于输出数据(并且紧跟在上面的块之后):

<output>
<xsl:for-each select="$nodes">
<xsl:sort select="position()" order="descending"></xsl:sort>
<xsl:variable name="index" select="index-of($orderd,current())" as="xs:integer*"></xsl:variable>
<xsl:variable name="pos" select="position()"></xsl:variable>        
<session reverse-documentOrder="{$pos}"  sortedOrder="{$index}"/>
</xsl:for-each>
</output>
Run Code Online (Sandbox Code Playgroud)

正如输出(如下所示)所示,index-of 函数返回序列 …

sequences saxon indexof xslt-2.0 xpath-2.0

5
推荐指数
1
解决办法
2083
查看次数

XSLT2:如何在XPath2谓词中引用有关当前节点的属性

我发布了另一个问题作为它的一个方面.我被告知要澄清这个问题,但这个问题已经很长很复杂了,所以我创建了一个新问题.

我想知道在XPath表达式测试中是否存在引用当前节点属性的标准方法.

例如,请考虑以下XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:for-each select="potato/stem[eye]">
        In session <xsl:value-of select="@sessionID"/>, the potato had <xsl:value-of select="/potato/stem[@sessionID=@sessionID][scc]/scc/@leafnumber"/> s.c.c. leaves.
    </xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

(此问题底部的XML源.)(请注意,for-each引用了类型为[eye]的节点,但请求的第二个值引用了类型为stem [scc]的节点,这些节点位于源XML树的不同分支上.)

现在,显然,"@ sessionID = @sessoinID"部分大部分都没有意义,因为XPath将其视为"节点的sessionID属性的值应该等于......节点的sessionID属性的值."

但我想说的是"测试以确保该节点的seesionID属性的值(XPath表达式中的那个)与我所在的/ stem [eye]节点的节点的sessionID相同马上."

我无法使用变量执行此操作,因为不允许在for-each子句中声明变量.

作为参考,这是XML源.它的结构不是人们想要的,但它是我必须要合作的.

<?xml version="1.0" encoding="utf-8"?>
<potato>
<stem sessionID="1">
    <eye number = "25"/>
</stem>
<stem sessionID="3">
    <eye number = "33"/>
</stem>

<stem sessionID="1">
    <scc leafnumber = "234" />
</stem>
<stem sessionID="2">
    <scc leafnumber = "433"/>
</stem>
<stem sessionID="3">
    <scc leafnumber = "463"/> …
Run Code Online (Sandbox Code Playgroud)

xpath xslt-2.0 xpath-2.0

4
推荐指数
2
解决办法
1万
查看次数

Cython:如何在 pxd 文件中声明默认值

我有一个想要抽象为可导入模块的函数:

cdef list generate_random_vectors(int num_vectors, int length, float scale=1):
    cdef list return_list
    np.random.seed()
    return_list = []
    for n in range(num_vectors):
    return_list.append((1 - 2 * np.random.rand(length)) / scale)
    return return_list
Run Code Online (Sandbox Code Playgroud)

要将其放入模块中,我必须在 pxd 文件中定义它。

当我尝试这个时:

cdef list generate_random_vectors(int num_vectors, int length, float scale)
Run Code Online (Sandbox Code Playgroud)

我收到错误:函数签名与先前的声明不匹配。

当我尝试这个时:

cdef list generate_random_vectors(int num_vectors, int length, float scale=1)
Run Code Online (Sandbox Code Playgroud)

我收到错误:预期为“)”,发现为“INT”

default-value cython python-2.7

3
推荐指数
1
解决办法
1488
查看次数