如何以最佳速率创建最佳可用的xsl



这是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. 如果产品<AvailabilityStatus>为"Available",则只取Available,否则取On-Request

我如何在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>

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

在本例中,如果要对XML文件应用XSLT,则不需要使用document函数。(如果文档函数引用的是一个不同的文件,那么只需直接对该文件应用XSLT,因为XSLT不会对原始文件执行任何操作!)

无论如何,如果你的排序语句是围绕错误的方式,这不是它不工作的原因。你需要在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>

相关内容

  • 没有找到相关文章

最新更新