这是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>
是&#39;可用&#39;,则只采取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>
答案 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>