XSLT-根据多个级别的子节点对父母进行分类



我读了许多XSLT实现,用于根据孩子对父节点进行分类。但是我找不到解决方案的解决方案。我想根据其子节点的(元素)值在多个级别上称为'sortfield'的元素节点。我有以下XML结构:

<Root>
    <OtherElement1></OtherElement1>
    <Group>
        <ID></ID>
        <Name></Name>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>B</SortField>

                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>H</SortField>

                        <ElementRef>
                        [...]
                        </ElementRef>
                    </Element>
                </ElementRef>
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>F</SortField>
                    </Element>
                </ElementRef>
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>G</SortField>
                    </Element>
                </ElementRef>           
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>C</SortField>
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>A</SortField>
            </Element>
        </ElementRef>

    </Group>
    <OtherElement2></OtherElement2>
</Root>

结果应该看起来像:

<Root>
    <OtherElement1></OtherElement1>
    <Group>
        <ID></ID>
        <Name></Name>

        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>A</SortField>
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>B</SortField>

                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>F</SortField>
                    </Element>
                </ElementRef>
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>G</SortField>
                    </Element>
                </ElementRef>   
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>H</SortField>

                        <ElementRef>
                        [...]
                        </ElementRef>
                    </Element>
                </ElementRef>       
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>C</SortField>
            </Element>
        </ElementRef>

    </Group>
    <OtherElement2></OtherElement2>
</Root>

您可以为我提供一个工作的XSLT吗?

请注意:所有其他元素和属性都保持不变

非常重要。

使用带有xsl:sort的模板:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.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="*[ElementRef]">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="*">
                <xsl:sort select="Element/SortField" data-type="text"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

转换输入

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <OtherElement1></OtherElement1>
    <Group>
        <ID></ID>
        <Name></Name>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>B</SortField>

                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>H</SortField>

                        <ElementRef>
                            [...]
                        </ElementRef>
                    </Element>
                </ElementRef>
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>F</SortField>
                    </Element>
                </ElementRef>
                <ElementRef>
                    <ID></ID>
                    <Element>
                        <ID></ID>
                        <Name></Name>
                        <SortField>G</SortField>
                    </Element>
                </ElementRef>           
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>C</SortField>
            </Element>
        </ElementRef>
        <ElementRef>
            <ID></ID>
            <Element>
                <ID></ID>
                <Name></Name>
                <SortField>A</SortField>
            </Element>
        </ElementRef>

    </Group>
    <OtherElement2></OtherElement2>
</Root>

进入输出

<?xml version="1.0" encoding="utf-8"?>
<Root>
   <OtherElement1/>
   <Group>
      <ID/>
      <Name/>
      <ElementRef>
         <ID/>
         <Element>
            <ID/>
            <Name/>
            <SortField>A</SortField>
         </Element>
      </ElementRef>
      <ElementRef>
         <ID/>
         <Element>
            <ID/>
            <Name/>
            <SortField>B</SortField>
            <ElementRef>
               <ID/>
               <Element>
                  <ID/>
                  <Name/>
                  <SortField>F</SortField>
               </Element>
            </ElementRef>
            <ElementRef>
               <ID/>
               <Element>
                  <ID/>
                  <Name/>
                  <SortField>G</SortField>
               </Element>
            </ElementRef>
            <ElementRef>
               <ID/>
               <Element>
                  <ID/>
                  <Name/>
                  <SortField>H</SortField>
                  <ElementRef>
                            [...]
                        </ElementRef>
               </Element>
            </ElementRef>
         </Element>
      </ElementRef>
      <ElementRef>
         <ID/>
         <Element>
            <ID/>
            <Name/>
            <SortField>C</SortField>
         </Element>
      </ElementRef>
   </Group>
   <OtherElement2/>
</Root>

最新更新