我有一个简单的问题,但我无法找出我做错了什么。
我有一个具有这种结构的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>
答案 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>