#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: Дополнительное содержимое в конце документа»…