我是XSL的新手,我有一个像上面的xml文件,我想将它转换为csv我使用java main来执行它但我在xsl文件中有一个问题,即在xsl文件中设置位置编号
<parent>
<child name="a" type="1"/>
<child name="b" type="2"/>
<child name="c" type="1"/>
<child name="d" type="3"/>
</parent>
输出结果为:
a 1
b 2
c 1
d 3
但我想得到的是:
child name type
1 a 1
2 b 2
3 c 1
4 d 3
第一列应该是子位置
这是我的xsl文件
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="child">
<!--header row-->
<xsl:for-each select="child">
<xsl:number value="position()" format="1" />
<xsl:apply-templates />
<xsl:text> </xsl:text>
</xsl:for-each>
<xsl:for-each select="@*">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:value-of select="';'"/>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
总结一下,我有两个问题,如何添加标题行如示例,以及如何获取子项的位置并添加它
答案 0 :(得分:1)
您可以使用concat()
,如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:value-of select="'child;name;type'"/>
<xsl:text> </xsl:text>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="child">
<xsl:value-of select="concat(position(), ';',@name, ';', @type)"/>
<xsl:if test="position() != last()">
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
您最好匹配父项,打印标题行,然后循环遍历子项:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="parent">
<!--header row-->
<xsl:text>child;name;type </xsl:text>
<xsl:for-each select="child">
<xsl:number value="position()" format="1" />
<xsl:text>;</xsl:text>
<xsl:for-each select="@*">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
如其他答案中所述,您的主要问题是上下文:您必须位于parent
的上下文中才能<xsl:for-each select="child">
。
如果您希望这是动态的,包括标题行,请尝试:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<!-- header row-->
<xsl:for-each select="*[1] | *[1]/@*">
<xsl:value-of select="local-name()"/>
<xsl:if test="position() != last()">
<xsl:text>;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
<!-- body -->
<xsl:for-each select="*">
<xsl:number/>
<xsl:text>;</xsl:text>
<xsl:for-each select="@*">
<xsl:value-of select="."/>
<xsl:if test="position() != last()">
<xsl:text>;</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>