#xml #xslt
#xml #xslt
Вопрос:
У меня простая проблема, но я не могу выяснить, что я делаю неправильно.
У меня есть XML с такой структурой:
<?xml version='1.0' encoding='UTF-8'?>
<GateDocument version="3">
<TextWithNodes>
<Node id="0"/>Ecuador
<Node id="1"/> Argentina
<Node id="2"/>Colombia
</TextWithNodes>
<!-- The default annotation set -->
</GateDocument>
Мне нужно преобразовать его в простую структуру. Поэтому я использую файл преобразования XSLT с такой структурой:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/GateDocument">
<GateDocument>
<TextWithNodes>
<xsl:for-each select="TextWithNodes/Node">
<node>
<id><xsl:value-of select="@id"/></id>
<value><xsl:value-of select="Node"/></value>
</node>
</xsl:for-each>
</TextWithNodes>
</GateDocument>
</xsl:template>
</xsl:stylesheet>
Но XML выводит значение тега узла отсутствует:
<GateDocument>
<TextWithNodes>
<node>
<id>0</id>
<value></value>
</node>
<node>
<id>1</id>
<value></value>
</node>
<node>
<id>2</id>
<value></value>
</node>
</TextWithNodes>
</GateDocument>
Я думаю, что с XSLT что-то не так, но я не могу разобраться.
Ожидаемый результат:
<GateDocument>
<TextWithNodes>
<node>
<id>0</id>
<value>Ecuador</value>
</node>
<node>
<id>1</id>
<value>Argentina</value>
</node>
<node>
<id>2</id>
<value>Colombia</value>
</node>
</TextWithNodes>
</GateDocument>
Ответ №1:
<Node id="0"/>Ecuador
doesn't mean that "Ecuador" is Node's value but a text() after "Node".Change your Input XML to:
<GateDocument version="3">
<TextWithNodes>
<Node id="0">Ecuador</Node>
<Node id="1">Argentina</Node>
<Node id="2">Colombia</Node>
</TextWithNodes>
<!-- The default annotation set -->
</GateDocument>
и в XSLT есть ошибка, контекстный узел for-each является узлом, следовательно, значение-of должно быть просто текущим () или точкой (.):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/GateDocument">
<GateDocument>
<TextWithNodes>
<xsl:for-each select="TextWithNodes/Node">
<node>
<id>
<xsl:value-of select="@id"/>
</id>
<value>
<xsl:value-of select="."/>
</value>
</node>
</xsl:for-each>
</TextWithNodes>
</GateDocument>
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. Привет! Спасибо за ответ! Я пробовал это и, похоже, не работает.