XSLT Выдает отображаемое значение, используя для каждого

#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. Привет! Спасибо за ответ! Я пробовал это и, похоже, не работает.