这是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>
如果产品
<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>