XSLT 2.0, использующий ключ с исключением, возвращает неожиданный результат - PullRequest
0 голосов
/ 22 октября 2018

Примечание: заголовок изменен, чтобы лучше отражать проблему.

Мои 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

Пока я не смогу решить текущие проблемы с коллекцией XSLT () в eXist-DB, я возвращаюсь к своему предыдущему решению: xml-документу TEI corpus, который содержит основной список всехсвязанные документы tei-xml через xi:include.Таким образом, я предоставляю один узел документа, с помощью которого процессор может получить доступ ко всем XML-документам и выполнить поиск по ним.

Итак, я объявляю корпусный документ:

<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 должен исключить текущий@corresp.И все же он включен в результаты.

1 Ответ

0 голосов
/ 23 октября 2018

Оператор except работает с последовательностями узлов на основе идентификатора узла, см. https://www.w3.org/TR/xpath20/#combining_seq определение

Оператор исключения принимает две последовательности узлов в качестве операндов и возвращает последовательность, содержащую всеузлы, которые встречаются в первом операнде, но не во втором операнде ... Все эти операторы удаляют дубликаты узлов из своих последовательностей результатов на основе идентификатора узла

Исходя из этого, я думаю, вы просто хотите

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

Использование data на узлах, которые атомизируют узлы до значений, а затем попытка использовать except, который работает на узлах, для меня не имеет смысла.

...