按多个元素排序



我对XSLT的基础知识很熟悉,但是我已经遇到了一个奇怪的情况,我似乎无法弄清楚。对于这么长的时间,我深表歉意,但我真的很感谢您提供的任何帮助。

我想根据排序的brand/valial/@name和doc/value/@名称的串联来对latve_5节点进行排序_5节点

XML unsorted:
<Root att="x">
  <Level_1 Name="NEW Level">    
    <Level_2>      
      <Level_3 Name="nameLvl_3">        
        <Level_4>       
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="1" />
            </Brand>            
        <Docs>
              <Value Name="Pro" Value="2" />
              <Value Name="Numeric" Value="0.05" />
            </Docs>            
          </Level_5>              
          <Level_5 Name="aa">            
            <Text>
              <Val Id="1"/>
            </Text>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="2" />
              <Value Name="Number" Value="1" />
              <Value Name="Long" Value="3" />
            </Brand>
          </Level_5>
        </Level_4>
      </Level_3>
    </Level_2>    
  </Level_1>
</Root>

执行串联后,您应该拥有",longnumberText,textnumericpro预期的输出为:

<Root att="x">
  <level_1 Name="NEW Level">    
    <level_2>      
      <Level_3 Name="nameLvl_3">        
        <Level_4>
          <Level_5 Name="aa">            
            <Text>
              <Val Id="1"/>
            </Text>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
          <Value Name="Long" Value="3" />
      <Value Name="Number" Value="1" />
              <Value Name="Text" Value="2" />             
            </Brand>
          </Level_5>
          <Level_5 Name="aa">
            <Brand>
              <Value Name="Text" Value="1" />
            </Brand>            
    <Docs>          
              <Value Name="Numeric" Value="0.05" />
              <Value Name="Pro" Value="2" />
            </Docs>            
          </Level_5>
        </Level_4>
      </Level_3>
    </Level_2>    
  </Level_1>
</Root>

我只能按/brand/value/@name的第一个元素进行排序,但我不知道品牌和文档中其余的属性如何加以串通,这是代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Level_3/Level_4/Level_5/Brand|Docs">
    <xsl:copy>
      <xsl:apply-templates>
        <xsl:sort select="@Name" data-type="text"/>
        <xsl:sort select="@Value" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  <!--                                                    -->
  <xsl:template match="Level_2/Level_3/Level_4">
    <xsl:copy>  
      <xsl:apply-templates select="Level_5">
        <xsl:sort select="Brand|Docs/Value/@Name" data-type="text"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

,但我只是将品牌或文档内部的第一个元素排序,请

可能有一种巧妙的方式可以在XPath 1.0表达式中进行此操作,但我没有看到一个。一种更直接的方法是分两个步骤处理数据。

首先编写执行近乎身份变换的样式表:输入只是将其写回输出,但是在每个级别_5元素上,您添加一个用sort-key添加属性,您可以通过处理所有内容来构建它们适当的儿童以钥匙模式。

然后编写其他样式表并使用sort-key属性来控制排序(如果您不希望它再次将其放置)。

在另一个主题上:匹配模式Level_3/Level_4/Level_5/Brand | Docs不等于Level_3/Level_4/Level_5/Brand | Level_3/Level_4/Level_5/Docs。如果您的意思是后者,则需要不同的匹配模式。

相关内容

  • 没有找到相关文章

最新更新