如何以最佳价格创建最佳可用xsl?

时间:2014-05-20 18:11:27

标签: xml xslt xslt-1.0

这是xml

<Products>
    <Product>
        <ProductCode>1001</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>15.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1001</ProductCode>
        <AvailabilityStatus>ON-Request</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1002</ProductCode>
        <AvailabilityStatus>ON-Request</AvailabilityStatus>
        <TotalPrice>15.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1002</ProductCode>
        <AvailabilityStatus>ON-Request</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1003</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>15.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1003</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
</Products>

我需要像下面那样放

<Products>
    <Product>
        <ProductCode>1001</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>15.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1002</ProductCode>
        <AvailabilityStatus>ON-Request</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
    <Product>
        <ProductCode>1003</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
</Products>
  1. 只需要便宜的价格。

  2. 如果产品<AvailabilityStatus>是&#39;可用&#39;,则只采取Available,否则On-Request

  3. 我是如何在xsl 1.0中编写的?

    我尝试下面(我尝试使用文档,因为有多个文件)

    这里的每件事都运行正常,但没有检查AvailabilityStatus

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl">
                <xsl:output method="xml" indent="yes"/>
                <xsl:key name="ServiceByGroup" match="Product" use="ProductCode"/>
    
    
                <xsl:template match="Products">
                    <xsl:copy>
                        <xsl:variable name="msNodes">
                            <xsl:apply-templates select="document('my_file.xml')">
    <xsl:sort select="TotalPrice" data-type="number"/>
                                <xsl:sort select="AvailabilityStatus" data-type="text"/>
    
                            </xsl:apply-templates>
                        </xsl:variable>
    
    
                        <Product>
                            <xsl:apply-templates select="exsl:node-set($msNodes)/Product [generate-id() =  generate-id(key('ServiceByGroup', ProductCode)[1])]"/>
                        </Product>
                    </xsl:copy>
                </xsl:template>
    
                <xsl:template match="node()|@*">
                    <xsl:copy>
                        <xsl:apply-templates select="node()|@*"/>
                    </xsl:copy>
                </xsl:template>
    
            </xsl:stylesheet>
    

1 个答案:

答案 0 :(得分:2)

当你的问题只显示一个时,我对你拥有多个文件的意思有点困惑。我假设您只想依次将XSLT应用于每个文件(而不是将它们合并为一个)。

在这种情况下,您不需要使用文档功能,如果这是您正在应用XSLT的XML文件。 (如果文档函数引用差异文件,那么只需将XSLT直接应用于该文件,因为XSLT对原始文件没有做任何事情!)

无论如何,如果你的排序陈述是错误的,那么它不起作用的原因。如果你想优先考虑&#34;可用&#34;你需要首先对 AvailabityStatus 进行排序。先是。

试试这个XSLT,它不需要文档功能,或节点设置扩展功能

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:key name="ServiceByGroup" match="Product" use="ProductCode"/>

    <xsl:template match="Products">
        <xsl:copy>
            <xsl:apply-templates select="Product[generate-id() =  generate-id(key('ServiceByGroup', ProductCode)[1])]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Product">
        <xsl:for-each select="key('ServiceByGroup', ProductCode)">
            <xsl:sort select="AvailabilityStatus" data-type="text"/>
            <xsl:sort select="TotalPrice" data-type="number"/>
            <xsl:if test="position() = 1">
                <xsl:call-template name="identity" />
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这会产生以下输出,该输出与问题中显示的输出相匹配

<Products>
   <Product>
        <ProductCode>1001</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>15.000</TotalPrice>
    </Product>
   <Product>
        <ProductCode>1002</ProductCode>
        <AvailabilityStatus>ON-Request</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
   <Product>
        <ProductCode>1003</ProductCode>
        <AvailabilityStatus>Available</AvailabilityStatus>
        <TotalPrice>10.000</TotalPrice>
    </Product>
</Products>