2017-09-13 57 views
0

自从我处理XPath/XSL以来,我已经有一段时间了,我似乎无法使用“sort”来处理循环。通过下面的示例XML,我想要做的是基于'ExternalName'为'isDefault'的'TextValue'属性的值进行排序。所以对于示例XML和第一次排序尝试,我期望按照'Blah2'和'Blah1'的顺序进行迭代。我已经尝试了很多变体,甚至尝试对元素值进行排序,但似乎无法完成任何工作。任何帮助,将不胜感激。XSL for-each with sort

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"/> 
+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> 
+0

我对接受的延迟表示歉意。我被拉到其他东西。因此,看起来我尝试的类型是正确的,但是完整的XSL中的某些内容会导致它出乎意料地行为,我们将在接下来的几天中看到它。感谢您使用示例输入/输出的完整答案。 –