XSLT问题显示值使用每个

时间:2014-06-26 11:38:55

标签: 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 个答案:

答案 0 :(得分: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的上下文节点是Node,因此value-of应该只是current()或点(。):

<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>