我知道这个问题有点不明确,但我不知道如何更好地说出来。这是我的问题:我有一个XML文档,并希望使用XSL将其转换为另一个XML-Document但没有树结构,因此所有元素都显示为列表。例如:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>
<given_name>Peter</given_name>
<surname>Pan</surname>
<title>PhD</title>
</name>
<contactdata>
<email>peter.pan@gmail.com</email>
<office>
<building>B10</building>
<room>016</room>
</office>
<phone type="office">01234567</phone>
</contactdata>
<organization>
<group>Something Cool</group>
<department>Awesome Stuff!!!</department>
</organization>
将转换为:
<?xml version="1.0" encoding="UTF-8"?>
<shallow>
<person />
<person-name />
<person-name-given_name />
<person-name-surname />
<person-name-title />
<person-contactdata />
<person-contactdata-email />
<person-contactdata-office />
<person-contactdata-office-building />
<person-contactdata-office-room />
<person-contactdata-phone />
<person-organization />
<person-organization-group />
<person-organization-department />
</shallow>
到目前为止我的代码:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<shallow>
<xsl:apply-templates>
<xsl:with-param name="predecessor" select="local-name()"/>
</xsl:apply-templates>
</shallow>
</xsl:template>
<xsl:template match="*">
<xsl:param name="predecessor"/>
<xsl:element name="{$predecessor}"/>
<xsl:apply-templates>
<xsl:with-param name="predecessor" select="concat($predecessor, '-', local-name())"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
但它只会迭代到所有东西的第一个孩子,输出不太正确......
我会感激任何帮助,非常感谢!!
答案 0 :(得分:0)
它确实迭代;它是未正确计算的输出元素的名称。
你只需要改变:
<xsl:element name="{$predecessor}"/>
使用:
<xsl:element name="{concat($predecessor, '-', local-name())}"/>
PS:标签中包含的文本也会输出,这可能会通过这个额外的修改(如果需要)得到纠正:
<xsl:apply-templates select="*">
<xsl:with-param name="predecessor" select="concat($predecessor, '-', local-name())"/>
</xsl:apply-templates>
通过所有这些修改,到目前为止我的输出:
<?xml version="1.0" encoding="UTF-8"?>
<shallow>
<person-name/>
<person-name-given_name/>
<person-name-surname/>
<person-name-title/>
<person-contactdata/>
<person-contactdata-email/>
<person-contactdata-office/>
<person-contactdata-office-building/>
<person-contactdata-office-room/>
<person-contactdata-phone/>
<person-organization/>
<person-organization-group/>
<person-organization-department/>
</shallow>