-1

我是 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>
4

2 回答 2

2

看起来您想将所有出现在B元素下的任何级别的Attr元素组合在一起。

首先,您需要一个模板来匹配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>
于 2012-07-24T11:50:44.893 回答
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>
于 2012-07-24T11:49:39.217 回答