我正在尝试使用从here修改的java代码来提取"节点中的所有属性"下面的示例xml数据中的元素。输出是一个空白的csv,只有样式表中定义的标题。由于代码工作,我怀疑样式表定义不正确,但我不知道如何解决它。我该如何纠正?
sample.xml中
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE network SYSTEM "http://www.matsim.org/files/dtd/network_v2.dtd">
<network>
<nodes>
<node id="1" x="-53196.450154726146" y="-3755010.0058102254" >
</node>
<node id="10" x="-54879.37761845079" y="-3753903.660850382" >
</node>
<node id="100" x="-46659.23389528884" y="-3749500.821686937" >
</node>
<node id="101" x="-54624.44957950422" y="-3757195.8898357535" >
</node>
</nodes>
</network>
style.xsl
?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
id,x,y
<xsl:for-each select="//node">
<xsl:value-of select="node/@*"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
这里有两个问题。两者都出现在同一个陈述中
<xsl:value-of select="node/@*"/>
首先,您已经定位在node
元素上,因此这将查找名为node
的子元素,其中没有元素。应该是这个....
<xsl:value-of select="@*"/>
但是,这导致了第二个问题。在XSLT 1.0中,xsl:value-of
仅在给定节点集时才返回第一个节点的值,因此虽然@*
将选择所有节点,但<xsl:value-of select="@*"/>
只会输出第一个节点。
现在,你可以这样做......
<xsl:for-each select="@*">
<xsl:value-of select="." />
</xsl:for-each>
但是属性不是以XML格式排序的,因此无法保证它们将按照您期望的顺序返回。因此,当然,您必须明确选择属性
<xsl:value-of select="@id" />
<xsl:value-of select="@x" />
<xsl:value-of select="@y" />