使用XSLT在一个级别上具有多个XML级别的XML

时间:2014-11-02 13:23:57

标签: xml xslt

我是XSL的新手,我对几个子元素有两个问题。

我的XML文档中有以下结构:

<root>
  <levelOne>
  <entry1>Test1</entry1>
  <entry2>Test2</entry2>
    <levelTwo>
      <entry3>Test3</entry3>
      <entry4>Test4</entry4>
      <levelThree>
        <entry5>Test5</entry5>
        <entry6>Test6</entry6>
      </levelThree>
    </levelTwo>
  </levelOne>
  <levelOne>
  <entry1>Test1</entry1>
  <entry2>Test2</entry2>
    <levelTwo>
      <entry3>Test3</entry3>
      <entry4>Test4</entry4>
      <levelThree>
        <entry5>Test5</entry5>
        <entry6>Test6</entry6>
      </levelThree>
    </levelTwo>
  </levelOne>
  <!-- etc. -->
</root>

我的XSL看起来像这样:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<resultlistEntries>
    <xsl:for-each select="levelOne">
        <entry1><xsl:value-of select="entry1"/></entry1>
        <entry2><xsl:value-of select="entry2"/></entry2>
        <!-- address child elements? -->
    </xsl:for-each>
</resultlistEntries>
</xsl:template>
</xsl:stylesheet>

我希望条目3,4,5,6等在我的输出XML文档中是同一级别。所以预期的输出应该是这样的:

<root>
  <levelOne>
  <entry1>Test1</entry1>
  <entry2>Test2</entry2>
  <entry3>Test3</entry3>
  <entry4>Test4</entry4>
  <entry5>Test5</entry5>
  <entry6>Test6</entry6>
  <entry1>Test1</entry1>
  <entry2>Test2</entry2>
  <entry3>Test3</entry3>
  <entry4>Test4</entry4>
  <entry5>Test5</entry5>
  <entry6>Test6</entry6>
  <!-- etc. -->
</root>
  1. 如何解决子元素的子元素 (第3,第4等级)?
  2. 如何拥有所有这些孩子 一个级别的元素(在我的例子中,在resultlistEntries中)?

1 个答案:

答案 0 :(得分:0)

假设各种<entryX>元素没有任何共同点,除了它们都带有文本节点,请尝试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root" >
    <root>
        <levelOne>
            <xsl:apply-templates select="levelOne/*"/>
        </levelOne>
    </root>
</xsl:template>

<xsl:template match="*[text()]" >
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>