XSLT 2.0与key一起使用键会返回意外结果

时间:2018-10-22 20:58:54

标签: xslt xslt-2.0

注意:更改标题以更好地反映问题。

我的xml文档包含一个元素<tei:seg @type @xml:id @corresp>,该元素包装了一些“故事”。属性@corresp使我可以将这些故事与主故事联系起来。例如,这些seg都通过它们的@corresp连接起来:

doc1.xml//seg[@type='dep_event' @corresp='#JKL' @xml:id='doc1-05']
doc2.xml//seg[@type='dep_event' @corresp='#JKL' @xml:id='doc2-06']
doc6.xml//seg[@type='dep_event' @corresp='#JKL' @xml:id='doc6-03']

我的目标是:当XSLT模板找到@corresp时,在其他文档中找到具有相同seg的其他@corresp并输出各自的`@xml:id``

因此,在上面的示例中,如果当前的seg@xml:id='doc1-05',则模板将输出一个列表:Corresponds to doc2-06, doc6-03

在我可以解决eXist-DB中的current problems with XSLT collection()之前,我只能依靠以前的解决方案:一个'TEI corpus'xml文档,该文档通过{{维护所有相关tei-xml文档的主列表。 1}}。这样,我提供了一个文档节点,处理器可以通过该节点访问和搜索所有xml文档。

因此,我声明了语料库文档:

xi:include

然后为<xsl:variable name="corpus" select="doc('ms609_corpus.xml')"/> 创建一个key

@corresp

然后我将密钥与<xsl:key name="correspkey" match="//tei:seg[@type='dep_event' and @corresp]" use="@corresp"/> 一起使用进行搜索:

doc()

它返回结果,但是<xsl:when test="tei:seg[@type='dep_event' and @corresp]"> <xsl:variable name="correspvar" select="data(self::seg[@type='dep_event' and @corresp]/@corresp)"/> <xsl:text>Corresponds to </xsl:text> <xsl:value-of select="data($corpus/(key('correspkey',$correspvar) except $correspvar)/@xml:id)" separator=", "/> </xsl:when> 应该排除当前的except。但它仍包含在结果中。

1 个答案:

答案 0 :(得分:2)

except运算符根据节点标识对节点序列进行处理,请参见https://www.w3.org/TR/xpath20/#combining_seq定义

  

except运算符将两个节点序列作为操作数,并返回一个   包含出现在第一个操作数中的所有节点的序列,但   不在第二个操作数中...所有这些运算符都消除了重复项   节点根据其身份从其结果序列中获取

基于这一点,我认为您只是想要

 <xsl:value-of select="$corpus/(key('correspkey', current()/@corresp) except current())/@xml:id)" separator=", "/>

在节点上使用data将节点雾化为值,然后尝试使用在节点上起作用的except对我来说似乎没有意义。