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 回答