XSL for-each排序

时间:2017-09-13 14:03:31

标签: xml xslt

自从我处理过XPath / XSL之后已经有一段时间了,我似乎无法排序'排序'使用循环。使用下面的示例XML,我想要做的是根据' TextValue'的值来排序。属性where' ExternalName'是' isDefault'。因此,使用示例XML和第一次排序尝试,我希望按照“Blah2'”的顺序进行迭代。然后' Blah1'。我尝试了很多变化,甚至尝试仅仅对元素值进行排序,但似乎无法使用任何类型。任何帮助将不胜感激。

XML:

<ProductsExport>
    <ProductExport>
        <ProductId>1</ProductId>
        <ProductCode>Blah1</ProductCode>
        <ProductType>Apparel</ProductType>
        <Attributes>
            <Attribute TextValue="Yes" ExternalName="Something" LocaleID="Default"/>
            <Attribute TextValue="No" ExternalName="isDefault" LocaleID="Default"/>
        </Attributes>
    </ProductExport>
    <ProductExport>
        <ProductId>2</ProductId>
        <ProductCode>Blah2</ProductCode>
        <ProductType>Apparel</ProductType>
        <Attributes>
            <Attribute TextValue="Yes" ExternalName="Something" LocaleID="Default"/>
            <Attribute TextValue="Yes" ExternalName="isDefault" LocaleID="Default"/>
        </Attributes>
    </ProductExport>
</ProductsExport>

排序尝试:

<xsl:sort select="./Attributes/Attribute[@ExternalName = 'isDefault']/@TextValue" order="descending"/>
<xsl:sort select="/ProductsExport/ProductExport/@ProductCode"/>
<xsl:sort select="@ProductCode"/>
<xsl:sort select="./ProductsExport/ProductExport/@ProductCode"/>

1 个答案:

答案 0 :(得分:1)

您的XPath正在尝试作为属性ProductCode访问@ProductCode ...它是一个元素。

<xsl:template  match="/">
  <ProductsExport>
  <xsl:for-each select="ProductsExport/ProductExport">
    <xsl:sort select="./Attributes/Attribute[@ExternalName = 'isDefault']/@TextValue" 
              order="descending"/>
    <xsl:sort select="./ProductCode"/>
    <xsl:copy-of select="."/>
  </xsl:for-each>
  </ProductsExport>
</xsl:template>

...示例输入...

<ProductsExport>
  <ProductExport>
    <ProductCode>BlahD</ProductCode>
    <Attributes>
      <Attribute TextValue="Yes" ExternalName="isDefault" LocaleID="Default"/>
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahC</ProductCode>
    <Attributes>
      <Attribute TextValue="No" ExternalName="isDefault" LocaleID="Default"/>
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahB</ProductCode>
    <Attributes>
      <Attribute TextValue="Yes" ExternalName="isDefault" LocaleID="Default"/>
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahA</ProductCode>
    <Attributes>
      <Attribute TextValue="No" ExternalName="isDefault" LocaleID="Default"/>
    </Attributes>
  </ProductExport>
</ProductsExport>

...示例输出......

<ProductsExport>
  <ProductExport>
    <ProductCode>BlahB</ProductCode>
    <Attributes>
      <Attribute TextValue="Yes" ExternalName="isDefault" LocaleID="Default" />
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahD</ProductCode>
    <Attributes>
      <Attribute TextValue="Yes" ExternalName="isDefault" LocaleID="Default" />
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahA</ProductCode>
    <Attributes>
      <Attribute TextValue="No" ExternalName="isDefault" LocaleID="Default" />
    </Attributes>
  </ProductExport>
  <ProductExport>
    <ProductCode>BlahC</ProductCode>
    <Attributes>
      <Attribute TextValue="No" ExternalName="isDefault" LocaleID="Default" />
    </Attributes>
  </ProductExport>
</ProductsExport>