合并XML2XML XSLT中的节点列表

时间:2012-07-24 11:19:02

标签: xml xslt

我是XSLT的新手,并且在合并节点列表时遇到问题。感谢您对以下情况的帮助:

输入:

>       <A Id="1">
>         <B Id="4">
>           <Attr>
>             <someAttr1>2</someAttr1>
>             <someAttr2>1</someAttr2>
>           </Attr>
>           <C Id="7">
>             <Attr>
>              <someAttr3>2</someAttr3>
>              <someAttr4>1</someAttr4>
>              <someAttr5>7</someAttr5>
>             </Attr>
>           </C>
>         </B>
>         <B Id="9">
>           <Attr>
>             <someAttr1>6</someAttr1>
>             <someAttr2>0</someAttr2>
>           </Attr>
>           <C Id="11">
>             <Attr>
>              <someAttr3>1</someAttr3>
>              <someAttr4>3</someAttr4>
>              <someAttr5>5</someAttr5>
>             </Attr>
>           </C>
>         </B>
>       </A>

输出:

  <A Id="1">
    <B Id="4">
      <Attr>
        <someAttr1>2</someAttr1>
        <someAttr2>1</someAttr2>
        <someAttr3>2</someAttr3>
        <someAttr4>1</someAttr4>
        <someAttr5>7</someAttr5>
      </Attr>
    </B>
    <B Id="9">
      <Attr>
        <someAttr1>6</someAttr1>
        <someAttr2>0</someAttr2>
        <someAttr3>1</someAttr3>
        <someAttr4>3</someAttr4>
        <someAttr5>5</someAttr5>
      </Attr>
    </B>
  </A>

2 个答案:

答案 0 :(得分:2)

您希望将所有 Attr 元素组合在 B 元素下的任何级别。

首先,您需要一个模板来匹配 B 元素与 Attr 元素

<xsl:template match="B[Attr]">

在模板中,您将创建 Attr 元素,并复制 Attr 元素下的所有后代元素

<Attr>
   <xsl:copy-of select=".//Attr/*" />
</Attr>

这是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="B[Attr]">
      <B>
         <xsl:apply-templates select="@*"/>
         <Attr>
            <xsl:copy-of select=".//Attr/*" />
         </Attr>
      </B>
   </xsl:template>

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

当应用于您的示例XML时,输出以下内容

<A Id="1">
   <B Id="4">
      <Attr>
         <someAttr1>2</someAttr1>
         <someAttr2>1</someAttr2>
         <someAttr3>2</someAttr3>
         <someAttr4>1</someAttr4>
         <someAttr5>7</someAttr5>
      </Attr>
   </B>
   <B Id="9">
      <Attr>
         <someAttr1>6</someAttr1>
         <someAttr2>0</someAttr2>
         <someAttr3>1</someAttr3>
         <someAttr4>3</someAttr4>
         <someAttr5>5</someAttr5>
      </Attr>
   </B>
</A>

答案 1 :(得分:0)

这是一个简单的XSLT 1.0解决方案:

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

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

    <xsl:template match="B">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:for-each select='descendant::Attr'>
                    <xsl:copy-of select='*|@*' />
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>