Выполнить итерацию по узлам с помощью XSLT и получить значение атрибутов

#xml #xslt #hyperlink

#xml #xslt #гиперссылка

Вопрос:

У меня есть XML-файл со структурой, подобной приведенной ниже:

 <entries>
  <entry>
    <sense>
      <definition>
        <RegDef>
           <w ID="1">word1</w><w ID="2">word2</w>
        </RegDef>
     </definition>
    </sense>
   </entry>
  <entry>
    <sense>
      <definition>
        <RegDef>
           <w ID="12">word3</w><w ID="43">word4</w><w ID="413">word5</w>
        </RegDef>
     </definition>
    </sense>
   </entry>
.
.
.
</entries>
  

Я хочу выполнить итерацию по каждому узлу и получить значение идентификатора атрибута и отобразить его как гиперссылку.

Я пытался

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="entries/entry">
  <html>
   <a href="{concat('http://example.com/show.php?id=', entries/entry/list/sense/definition/w[@ID='0'])}">word</a>
  </html>
 </xsl:template>
</xsl:stylesheet>
  

Но это не дает мне никакого идентификатора. Я хочу, чтобы значение каждого идентификатора атрибута объединяло его в URL, а затем помещало в тег слово, в котором атрибут объединен в URL.

Я хочу, чтобы на выходе были: значения word1 и word2, подобные гиперссылке, и я хочу, чтобы каждая гиперссылка имела атрибут, совпадающий с атрибутом на узле word1 и word2

Ответ №1:

Приведенный ниже цикл for-each может помочь вам начать;

 <xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="entries/entry/sense/definition/RegDef">
        <xsl:for-each select="w">
            <html>
                <a href="{concat('http://example.com/show.php?id=', @ID)}">
                    <xsl:value-of select="."/>
                </a>
            </html>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
  

Комментарии:

1. Это работает, но моя фактическая структура XML немного отличается. У меня есть другой узел <определение> (<определение><Morf></Morf><RegDef><w></w></RegDef></definition>). Когда я запускаю пример с узлом <Morf>, он возвращает мне ошибку: «Эта страница содержит следующие ошибки: ошибка в строке 5 в столбце 1: Дополнительное содержимое в конце документа»…