Warm tip: This article is reproduced from serverfault.com, please click

sorting-如何获取具有相同名称的元素并根据XSLT中的子节点值对其进行排序

(sorting - How to fetch elements with same name and order them based on a subnode value in XSLT)

发布于 2020-12-02 10:43:38

我正在尝试转换输入XML,在该输入XML中,需要提取所有父节点说“ x”,对其进行排序,然后根据其子节点说“ y”的值在最终输出XML中重新排序。下面是我的XML,我正在尝试对其进行修改,以便最终的XML将具有按升序排列的元素,其中根据xpath中的数值notes/notesBODY/group/text(基本上是<text>1. </text>所有notes元素中存在的元素)进行排序但是输出XML并没有预期的那样,因为我似乎无法弄清楚如何在XSLT中准确地使用排序。任何帮助表示赞赏。

输入XML:

 <root>
    <group>
       <text>group1</text>
    </group>
    <group>
       <text>group2</text>
    </group>
    <notes>
        <notesText>notes1</notesText>
        <notesBODY>
            <group>
                <text>2. </text>
                <text>notesbody1</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
        <notesText>notes2</notesText>
        <notesBODY>
            <group>
                <text>1. </text>
                <text>notesbody2</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
        <notesText>notes3</notesText>
        <notesBODY>
            <group>
                <text>3. </text>
                <text>notesbody3</text>
            </group>
        </notesBODY>
    </notes>
    <group>
        <text>group3</text>
        <notes>
            <notesText>notes4</notesText>
            <notesBODY>
                <group>
                    <text>4. </text>
                    <text>notesbody4</text>
                </group>
            </notesBODY>
        </notes>
    </group>
    <group>
       <text>group4</text>
    </group>
    <group>
       <text>group5</text>
       <notes>
            <notesText>notes5</notesText>
            <notesBODY>
                <group>
                    <text>6. </text>
                    <text>notesbody5</text>
                </group>
            </notesBODY>
        </notes>
    </group>
    <notes>
        <notesText>notes6</notesText>
        <notesBODY>
            <group>
                <text>5. </text>
                <text>notesbody6</text>
            </group>
        </notesBODY>
    </notes>
    <group>
       <text>group6</text>
    </group>
    <group>
       <text>group7</text>
    </group>
    <group>
        <text>group8</text>
        <notes>
            <notesText>notes7</notesText>
            <notesBODY>
                <group>
                    <text>8. </text>
                    <text>notesbody7</text>
                </group>
            </notesBODY>
        </notes>
    </group>
    <notes>
        <notesText>notes8</notesText>
        <notesBODY>
            <group>
                <text>7. </text>
                <text>notesbody8</text>
            </group>
        </notesBODY>
    </notes>
    <group>
       <text>group9</text>
    </group>
 </root>

预期产量:

 <root>
    <group>
       <text>group1</text>
    </group>
    <group>
       <text>group2</text>
    </group>
    <group>
        <text>group3</text>
    </group>
    <group>
       <text>group4</text>
    </group>
    <group>
       <text>group5</text>
    </group>
    <group>
       <text>group6</text>
    </group>
    <group>
       <text>group7</text>
    </group>
    <group>
        <text>group8</text>
    </group>
    <group>
       <text>group9</text>
    </group>
    <notes>
        <notesText>notes2</notesText>
        <notesBODY>
            <group>
                <text>1. </text>
                <text>notesbody2</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
        <notesText>notes1</notesText>
        <notesBODY>
            <group>
                <text>2. </text>
                <text>notesbody1</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
        <notesText>notes3</notesText>
        <notesBODY>
            <group>
                <text>3. </text>
                <text>notesbody3</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
            <notesText>notes4</notesText>
            <notesBODY>
                <group>
                    <text>4. </text>
                    <text>notesbody4</text>
                </group>
            </notesBODY>
        </notes>
    <notes>
        <notesText>notes6</notesText>
        <notesBODY>
            <group>
                <text>5. </text>
                <text>notesbody6</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
            <notesText>notes5</notesText>
            <notesBODY>
                <group>
                    <text>6. </text>
                    <text>notesbody5</text>
                </group>
            </notesBODY>
    </notes>
    <notes>
        <notesText>notes8</notesText>
        <notesBODY>
            <group>
                <text>7. </text>
                <text>notesbody8</text>
            </group>
        </notesBODY>
    </notes>
    <notes>
        <notesText>notes7</notesText>
        <notesBODY>
            <group>
                <text>8. </text>
                <text>notesbody7</text>
            </group>
        </notesBODY>
    </notes>
 </root>

XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="notes">
          <xsl:apply-templates select="@*" />
   <xsl:copy>
      <xsl:apply-templates select="node()">
         <xsl:sort select="notesBODY/group/text[position() = 0]" />
      </xsl:apply-templates>
   </xsl:copy>
</xsl:template>
    </xsl:stylesheet>
Questioner
shweta
Viewed
0
Martin Honnen 2020-12-02 19:56:27

我想你基本上想使用两个模板

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>
  
  <xsl:template match="root">
      <xsl:copy>
          <xsl:apply-templates select="group"/>
          <xsl:apply-templates select=".//notes">
              <xsl:sort select="notesBODY/group/text[1]"/>
          </xsl:apply-templates>
      </xsl:copy>
  </xsl:template>
  
  <xsl:template match="group">
      <xsl:copy>
          <xsl:apply-templates select="* except notes"/>
      </xsl:copy>
  </xsl:template>

加上你已经拥有的身份转换。