Подсчет фигур в xslt - PullRequest
       10

Подсчет фигур в xslt

0 голосов
/ 19 сентября 2019

Я пытаюсь написать некоторый xslt, который будет перечислять все изображения в моем xml (s!)

Я использую ключ для этого, чтобы я мог ссылаться на изображения позже в содержании, моя проблема здесьЯ не могу понять, как получить постоянное значение.Значение: в xml есть ссылки на несколько других документов, которые я загружаю с помощью document (), всякий раз, когда я «ввожу» новый документ, ключ сбрасывается, поэтому в документах, имеющих 2 изображения, я получаю счетчик двух, в других - один

чтобы вы могли себе представить

корневой документ:

<root>
  <chapter href="chapters/doc1.xml"/>
  <chapter href="chapters/doc2.xml"/>
</root> 

doc1.xml

<root>
  <image id="a"/>
  <image id="b"/>
</root> 

doc2.xml

<root>
  <image id="f"/>
</root> 

Я нашел здесь старую ветку в стеке потока, которая, как мне кажется, идет в моем направлении: XSLT: создать «ключ» для нескольких документов? , но я не смог заставить его работать.

что в данный момент работает: я определил ключ

<xsl:key name="image" match="image" use="@id"/>

, который я использую позже, как это

 key value for image:<xsl:value-of select="count(key('image', @id)/preceding::image) + 1"/>

, это всегда дает упомянутый результат (для doc1 я получаю "key value for image:1 key value for image:2"bur for doc2 я снова получаю" key value for image:1 ", и здесь я ожидал бы 3)

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

<xsl:key name="images" match="image" use="all"/>
 <xsl:variable name="location"><xsl:value-of select="$xml-base"/>/chapters?select=*.xml;recurse=yes</xsl:variable>
<xsl:variable name="documents">
  <xsl:value-of select="collection($location)"/>
</xsl:variable>
<xsl:for-each select="collection($location)">
  <xsl:message>
    <xsl:value-of select="./count(key('figure','all'))"/>
  </xsl:message>
</xsl:for-each>

иэто всегда дает мне 0, я даже не уверен, что использование ключа - правильный подход здесь

tldr: как я могу перечислить изображения в xslt по нескольким документам?

* редактировать так, как я думаюнемного неясно: у меня есть несколько входов xml, импортированных корневым xml, все они могут содержать изображения, у меня есть окончательный выходной файл, который должен непрерывно перечислять все изображения и иметь возможность ссылаться на них

1 Ответ

1 голос
/ 19 сентября 2019

Этот последний документ имеет один элемент image, поэтому image не имеет preceding::image.

Также неясно, зачем вообще нужен ключ, если вы хотите сосчитать image элементов, count(//image) для одного документа или count(document(/root/chapter/@href)//image) для использования функции document в первом примере.или count(collection('chapters?select=*.xml;recurse=yes')//image) для специфического вызова XSLT 2/3 и Saxon 9 collection().

<xsl:key name="images" match="image" use="all"/> не имеет смысла, если только у элемента image нет дочерних элементов с именем all.

Работа с несколькими документами возможна, но требует дополнительных усилий.Если вам нужна общая обработка и вы не можете протолкнуть все элементы вместе через шаблон для использования position(), но каким-то образом нужно проиндексировать все эти image элементы, то, возможно, выполните <xsl:variable name="images" select="document(/root/chapter/@href)//image"/> и <xsl:variable name="image-ids" select="for $img in $images return generate-id($img)"/>, а затем просто используйте <xsl:value-of select="index-of($image-ids, generate-id())"/> влюбой xsl:template match="image" должен работать.

for $img in $images return generate-id($img) можно записать более компактно в XSLT 3 как $images ! generate-id().

...