我在xsl上工作,将思维导图文件转换为csv树结构。我使用python lxml
还有一个小问题 - 如何省略模板中必需的根标签?将它们留下结果:
AssertionError: ElementTree not initialized, missing root
源xml
<map version="0.9.0">
<node TEXT="Familie">
<node TEXT="Kinder">
<node TEXT="Sohn">
</node>
<node TEXT="Tochter">
<node TEXT="Hobbies">
<node TEXT="Fußball">
</node>
</node>
</node>
</node>
</node>
</map>
输出。注意 p 标签。如何放弃它们?
<p>,"Familie"
"Familie","Kinder"
"Familie","Kinder","Sohn"
"Familie","Kinder","Tochter"
"Familie","Kinder","Tochter","Hobbies"
"Familie","Kinder","Tochter","Hobbies","Fußball"
</p>
我的表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no" encoding="ISO-8859-1" omit-xml-declaration="yes" media-type="string"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="node">
<xsl:param name="par"/>
<xsl:variable name="nodetext" select="@TEXT"/>
<xsl:variable name="depth" select="count(ancestor::*)"/>
<xsl:value-of select="$par"/>,"<xsl:value-of select="$nodetext"/>"
<xsl:choose>
<xsl:when test="$depth<2">
<xsl:apply-templates>
<xsl:with-param name="par" select="concat('"',$nodetext,'"')"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates>
<xsl:with-param name="par" select="concat($par,',"',$nodetext,'"')"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
更改此模板:
<xsl:template match="/">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
......对此:
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
答案 1 :(得分:0)
我无法重复报告结果 - 使用Saxon 6.5.4我:
,"Familie"
"Familie","Kinder"
"Familie","Kinder","Sohn"
"Familie","Kinder","Tochter"
"Familie","Kinder","Tochter","Hobbies"
"Familie","Kinder","Tochter","Hobbies","Fuޢall"
任何兼容的XSLT处理器都应该尊重<xsl:output method="text"/>
并生成纯文本输出。
无论如何,如果您不想生成任何元素,请将其从转换中删除:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no" encoding="ISO-8859-1" omit-xml-declaration="yes" media-type="string"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="node">
<xsl:param name="par"/>
<xsl:variable name="nodetext" select="@TEXT"/>
<xsl:variable name="depth" select="count(ancestor::*)"/>
<xsl:value-of select="$par"/>,"<xsl:value-of select="$nodetext"/>"
<xsl:choose>
<xsl:when test="$depth<2">
<xsl:apply-templates>
<xsl:with-param name="par" select="concat('"',$nodetext,'"')"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates>
<xsl:with-param name="par" select="concat($par,',"',$nodetext,'"')"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>