我想在xml中迭代所有节点和子节点(递归地)并将元素转换为txt格式。 E.g:
<root>
<level>
<data1>data1</data1>
<sublevel>
<data2>data2</data2>
</sublevel>
</level>
</root>
我希望以txt格式输出以下内容:
root
level
data1:data1
sublevel
data2:data2
我目前的xslt转换是:
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:for-each select="*">
<xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
但它不会产生所需的输出。有一些错误:
感谢
答案 0 :(得分:0)
尝试更换:
xsl:value-of select="local-name()"
带
xsl:value-of select="text()"
您可以使用if
:
<if test="text() = '' >
我没有测试过代码,但是应该给你一个想法。
答案 1 :(得分:0)
使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="*">
<xsl:value-of select="local-name()"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()[normalize-space(.)]">
<xsl:value-of select="concat(':', .)"/>
</xsl:template>
</xsl:stylesheet>
MSXSL输出:
root
level
data1:data1
sublevel
data2:data2
答案 2 :(得分:0)
下面可能是一个很好的推动正确的方向:输出需要缩进和子元素不输出 - 但我想你将能够弄明白: - )。
<xsl:template match="/root">
<xsl:call-template name="nodeToText"/>
</xsl:template>
<xsl:template name="nodeToText">
<xsl:value-of select="local-name()"/>: <xsl:value-of select="."/><xsl:text>
</xsl:text>
<xsl:for-each select="child::*">
<xsl:call-template name="nodeToText"/>
</xsl:for-each>
</xsl:template>
这导致以下输出:
root: data1data2
level: data1data2
data1: data1
sublevel: data2
data2: data2