如何获取一个转换的xml文件,其中只包含一个父标记下每次出现的父标记的所有子标记

时间:2012-05-15 10:02:30

标签: xslt

我正在使用此输入xml文件。

                 <Content>
                <body><text>xxx</text></body>
                    <body><text>yy</text></body>
               <body><text>zz</text></body>
               <body><text>kk</text></body>
                   <body><text>mmm</text></body>
                        </Content>

在Xslt转换后,输出应为

                        <Content>
                 <body><text>xxx</text>
                       <text>yy</text>
                           <text>zz</text>
                     <text>kk</text>
                   <text>mmm</text></body>
                     </Content>

任何人都可以提供其相关的Xsl文件。

2 个答案:

答案 0 :(得分:2)

完全转型

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

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

 <xsl:template match="body"/>
 <xsl:template match="body[1]">
  <body>
   <xsl:apply-templates select="../body/node()"/>
  </body>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<Content>
    <body>
        <text>xxx</text>
    </body>
    <body>
        <text>yy</text>
    </body>
    <body>
        <text>zz</text>
    </body>
    <body>
        <text>kk</text>
    </body>
    <body>
        <text>mmm</text>
    </body>
</Content>

生成想要的正确结果

<Content>
   <body>
      <text>xxx</text>
      <text>yy</text>
      <text>zz</text>
      <text>kk</text>
      <text>mmm</text>
   </body>
</Content>

<强>解释

  1. identity rule “按原样”复制每个节点。

  2. 它被两个模板覆盖。第一个忽略/删除每个body元素。

  3. 覆盖标识模板的第二个模板也会覆盖第一个此类模板(删除每个body元素),以覆盖其中第一个body元素的body元素家长。仅对于此第一个body子项,将生成body元素,并在其正文中生成所有节点,这些节点是其父级的任何body子级的子节点(当前body元素并且处理了所有body兄弟姐妹。

答案 1 :(得分:1)

    <xsl:template match="Content">
      <body>
            <xsl:apply-templates select="body/text"/>
      </body>
    </xsl:template>

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