关于xml:XSL for-each与sort

XSL for-each with sort

自从我处理XPath / XSL以来已经有一段时间了,我似乎无法对循环进行"排序"。在下面的示例XML中,我要基于" TextValue"属性的值进行排序,其中" ExternalName"为" isDefault"。因此,通过示例XML和首次排序尝试,我期望按照" Blah2"然后" Blah1"的顺序进行迭代。我尝试了许多变体,甚至尝试仅对元素值进行排序,但似乎无法进行任何排序。任何帮助将不胜感激。

XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>

排序尝试:

1
2
3
4
<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"/>


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

1
2
3
4
5
6
7
8
9
10
<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>

...示例输入...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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>

...示例输出...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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>