正确定义xls样式表

时间:2017-10-30 14:16:14

标签: xml xslt

我正在尝试使用从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>

1 个答案:

答案 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" />