将所有节点作为没有树结构的新元素

时间:2015-11-19 13:08:33

标签: xml xslt

我知道这个问题有点不明确,但我不知道如何更好地说出来。这是我的问题:我有一个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>

但它只会迭代到所有东西的第一个孩子,输出不太正确......

我会感激任何帮助,非常感谢!!

1 个答案:

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