Получить значения элемента в xsl:variable

Пожалуйста, прости мое незнание XSLT, я довольно новичок в этом.

Использование saxon xslt 2.0: я пытаюсь получить один элемент из переменной xsl:, который выглядит так при применении <xsl:copy-of select="$type">:

  <type>
     <label>Book</label>
     <id>book</id>
  </type>

Пытался получить доступ только к элементу id - я пытался:

<xsl:copy-of select="$type/id">
<xsl:copy-of select="$type[2]">
<xsl:value-of select="$type/id">
<xsl:value-of select="$type[2]">

Также попробовал это и несколько вариантов, а также

<xsl:value-of select="$type[name()='id']"/>

И попытался изменить тип данных

<xsl:variable name="type" as="element"> 

В XSLT 2.0 node-set() манипуляции не применяются.

Я ищу подробное описание того, как правильно получить доступ к элементам xsl:variable, и был бы рад узнать, что я использую все это неправильно, есть лучший способ. Спасибо за ваши идеи и усилия.

@ martin-honnen При добавлении:

<xsl:variable name="test1">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

<TEST1><xsl:copy-of select="$test1/type/id"/></TEST1>

<xsl:variable name="test2" as="element()">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

<TEST2><xsl:copy-of select="$test2/id"/></TEST2>

Я получаю результат:

   <TEST1/>
   <TEST2/>

2 ответа

Решение

Если у вас есть

<xsl:variable name="type">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

тогда вам нужно, например, <xsl:copy-of select="$type/type/id"/> скопировать id элемент как type Переменная связана с временным узлом документа, содержащим type элемент узла с id узел дочернего элемента.

Или использовать

<xsl:variable name="type" as="element()">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

затем <xsl:copy-of select="$type/id"/> работает, так как теперь переменная связана с type элемент узла.

Вот полный пример с моими предложениями:

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

<xsl:output indent="yes"/>

<xsl:template match="/">

<xsl:variable name="test1">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

<TEST1><xsl:copy-of select="$test1/type/id"/></TEST1>

<xsl:variable name="test2" as="element()">
  <type>
     <label>Book</label>
     <id>book</id>
  </type>
</xsl:variable>

<TEST2><xsl:copy-of select="$test2/id"/></TEST2>

</xsl:template>

</xsl:stylesheet>

вывод

<TEST1>
   <id>book</id>
</TEST1>
<TEST2>
   <id>book</id>
</TEST2>

Чтобы получить доступ к значению элемента, просто правильно укажите XPath, то есть type/id

<xsl:value-of select="type/id" />
Другие вопросы по тегам