注意:更改标题以更好地反映问题。
我的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
。但它仍包含在结果中。
答案 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
对我来说似乎没有意义。