XSL: тест на ключ - PullRequest
       12

XSL: тест на ключ

0 голосов
/ 05 июня 2018

У меня большой список имен (с биографическими данными) в файле people.xml.Эти люди появляются в случайных местах в другом файле corpus.xml.Они «связаны» с @xml:id.

. Таким образом, в файле people.xml есть записи типа

<person xml:id="john_foo"/>
<person xml:id="ann_foo"/>
<person xml:id="sally_foo"/>
...

. И в файле corpus.xml мы можем найтиэти те же самые xml: идентификаторы (где угодно в документе) в @nameref

<corpus>
<p>
  <persName nameref="#john_foo" role="a"/>
  <persName nameref="#ann_foo" role="g"/>
  <s>
     <persName nameref="#john_foo" role="g"/>
  </s>
</p>
<p>
  <persName nameref="#sally_foo" role="a"/>
  <d>
     <persName nameref="#sally_foo" role="p"/>
  </d>
</p>
...
<corpus>

Я хочу проверить (используя XSL 3.0, Saxon) каждый people.xml//@xml:id на существование в corpus.xml/corpus//persName/@nameref НО только когда @role соответствует определенному значению.В этом случае я хочу вернуть «положительный результат», только если @role="a"

Я пытаюсь использовать для этого ключи, но ничего не возвращается:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0">

<xsl:key name="namerefs" match="corpus" use=".//persName[@role='a']"/>

<xsl:param name="documt" select="doc('corpus.xml')"/>

<xsl:template match="person">
  <!-- test if exists @xml:id + @role="a" -->
  <xsl:if test="key($namerefs, concat('#',@xml:id) ,$documt")>if found, do something here</xsl:if>
</xsl:template>

</xsl:stylesheet>

Я думаю, что у меня нет доступа к нужному узлу в ключе?

Большое спасибо заранее.

nb.Обновлено для различных опечаток

1 Ответ

0 голосов
/ 05 июня 2018

Это

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="persName" match="persName" use="substring-after(@nameref, '#')" />
  <xsl:param name="corpusDoc" select="document('corpus.xml')"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//person" />
  </xsl:template>

  <xsl:template match="person">
    <xsl:if test="key('persName', @xml:id, $corpusDoc)[@role = 'a']">
      <xsl:copy-of select="." />
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

выводит

<person xml:id="john_foo"/>
<person xml:id="sally_foo"/>

Вы можете переместить предикат [@role = 'a'] из <xsl:if> в <xsl:key>.Это бы сработало, но я не думаю, что оно того стоит.

...