1

このノードを一緒にマージする必要がありますが、属性を持つ親とマージする必要がありますmethod="a"

入力:

<myroot>
    <elem name="a" creationDate="">
        <list id="xxx" ver="uu">
            <nodeA id="a">
                <fruit id="small">
                    <orange id="x" method="create">                       
                        <color>Orange</color>                                               
                    </orange>
                </fruit>     
                <fruit id="small" method="a">
                    <kiwi id="y" method="create">                        
                        <color>Red</color>
                        <type>sour</type>                       
                    </kiwi>                    
                </fruit>
                <fruit id="large" method="a">
                    <melon id="y" method="create">
                        <attributes>
                            <color>Green</color>
                            <type>sweet</type>
                        </attributes>
                    </melon>                    
                </fruit>
            </nodeA>
        </list>
    </elem>
</myroot>

私のXSLファイル:

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

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

    <xsl:template match="list">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:for-each-group select="/*/*/*/*" group-by="@id">
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                    <xsl:for-each-group select="current-group()/*" group-by="concat(local-name(), '|', @id)">
                        <xsl:copy>
                            <xsl:apply-templates select="@*, *, (current-group() except .)/*"/>
                        </xsl:copy>
                    </xsl:for-each-group>
                </xsl:copy>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

私の出力:

<myroot>
    <elem name="a" creationDate="">
        <list id="xxx" ver="uu">
            <nodeA id="a">
                <fruit id="small">            
                    <orange id="x" method="create">                       
                        <color>Orange</color>                                               
                    </orange>
                    <kiwi id="y" method="create">                        
                        <color>Red</color>
                        <type>sour</type>                       
                    </kiwi>                    
                </fruit>     

                <fruit id="large" method="a">
                    <melon id="y" method="create">
                        <attributes>
                            <color>Green</color>
                            <type>sweet</type>
                        </attributes>
                    </melon>                    
                </fruit>
            </nodeA>
        </list>
    </elem>
</myroot>

期待される出力:

<myroot>
    <elem name="a" creationDate="">
        <list id="xxx" ver="uu">
            <nodeA id="a">
                <fruit id="small" method="a"> <!-- this is the correct merge where the merged is in parent that has a method -->
                    <kiwi id="y" method="create">                        
                        <color>Red</color>
                        <type>sour</type>                       
                    </kiwi>
                    <orange id="x" method="create">                       
                        <color>Orange</color>                                               
                    </orange>
                </fruit>     

                <fruit id="large" method="a">
                    <melon id="y" method="create">
                        <attributes>
                            <color>Green</color>
                            <type>sweet</type>
                        </attributes>
                    </melon>                    
                </fruit>
            </nodeA>
        </list>
    </elem>
</myroot>

ご覧のとおり、私の変換はそれを組み合わせるだけで、方法は考慮していません。method="a"例にある親にマージされるように変更する方法<fruit id="small" method="a">

ありがとうございました。ジョン

4

1 に答える 1

1

要素内では<xsl:for-each-group>、コンテキスト アイテムはグループの最初の要素にすぎないため、select="@*"最初の要素の属性のみがコピーされます。アクセスする必要がある要素内のすべての異なる名前の属性のコピーを取得するには、current-group()/@*.

select="*, (current-group() except .)/*"と同等なので、する必要もありませんselect="current-group()/*"

完全なスタイルシートは次のようになります

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

  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />

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

  <xsl:template match="list">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates select="*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="list/*">

      <xsl:copy>

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

        <xsl:for-each-group select="*" group-by="concat(local-name(), '|', @id)">
          <xsl:copy>
            <xsl:copy-of select="current-group()/@*" />
            <xsl:copy-of select="current-group()/*" />
          </xsl:copy>
        </xsl:for-each-group>

      </xsl:copy>

  </xsl:template>

</xsl:stylesheet>
于 2012-05-26T16:04:49.490 に答える