-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

簡単なXSLT1.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 に答える