计算比率的XML筛选器列表

时间:2016-03-30 08:53:39

标签: xml xslt

我正在处理一个非常奇怪的XML文件。这是图书馆中最受欢迎的图书清单。

标题一对两个项目有四个保留,给出两个保留/项目的比率。 标题二对一个项目有五个持有,给出四个持有/项目的比率,而标题三有五个持有/项目的比率。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="holdratio3.xsl"?>
<report>
<title>Individual Item Display</title>
<dateCreated>2016-03-29T16:58:57</dateCreated>
<dateFormat>yyyy/mm/dd</dateFormat>
<catalog>
    <marc>
        <marcEntry tag="245" label="Title" ind="10">Title one</marcEntry>
    </marc>
    <call>
        <item>
            <numberOfHolds>4</numberOfHolds>
            <type>LOAN</type>
        </item>
        <item>
            <numberOfHolds>4</numberOfHolds>
            <type>LOAN</type>
        </item>
    </call>
</catalog>
<catalog>
    <marc>
        <marcEntry tag="245" label="Title" ind="10">Title two</marcEntry>
    </marc>
    <call>
        <item>
            <numberOfHolds>5</numberOfHolds>
            <type>LOAN</type>
        </item>
    </call>
</catalog>
<catalog>
    <marc>
        <marcEntry tag="245" label="Title" ind="10">Title three</marcEntry>
    </marc>
    <call>
        <item>
            <numberOfHolds>4</numberOfHolds>
            <type>LOAN</type>
        </item>
    </call>
</catalog>
</report>

我有一个样式表,看起来像这样,它给出了预期的结果: Hold ratio output。 现在我想知道是否不可能再改进它。 我想过滤结果,只显示比率是否等于或大于3。 我用谷歌搜索,但找不到一个现场的解决方案 - 但我想这是为每个或应用模板?

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
    <catalog>
    <xsl:for-each select="report/catalog">
    <xsl:sort select="call/item/numberOfHolds div count(call/item [type='LOAN'])" order="descending" />
    <ratioline>
        <Title><xsl:value-of select="substring(marc/marcEntry[@tag='245'],1,30)"/></Title>
        <numberOfHolds><xsl:value-of select="call/item/numberOfHolds"/></numberOfHolds>
        <numberOfItemsSelectedType><xsl:value-of select="count(call/item[type='LOAN'])"/></numberOfItemsSelectedType>
            <ratio><xsl:value-of select="format-number(call/item/numberOfHolds div count(call/item[type='FLYTANDE' or type='HEMLAN']), '00.##')" /></ratio>
        </ratioline>
    </xsl:for-each>
    </catalog>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

您可以通过定义一个参数来保持3的值

<xsl:param name="min" select="3" />

要对其进行过滤,您可以先在xsl:for-each中定义一个变量以保持比率

<xsl:variable name="ratio" select="call/item/numberOfHolds div count(call/item [type='LOAN'])" />

然后您可以使用xsl:if来测试比率是否大于或等于您的参数

<xsl:if test="$ratio >= $min">

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="min" select="3" />
<xsl:template match="/">
    <catalog>
    <xsl:for-each select="report/catalog">
    <xsl:sort select="call/item/numberOfHolds div count(call/item [type='LOAN'])" order="descending" />
        <xsl:variable name="ratio" select="call/item/numberOfHolds div count(call/item [type='LOAN'])" />
        <xsl:if test="$ratio >= $min">
        <ratioline>
            <Title><xsl:value-of select="substring(marc/marcEntry[@tag='245'],1,30)"/></Title>
            <numberOfHolds>
                <xsl:value-of select="call/item/numberOfHolds"/>
            </numberOfHolds>
            <numberOfItemsSelectedType>
                <xsl:value-of select="count(call/item[type='LOAN'])"/>
            </numberOfItemsSelectedType>
            <ratio>
                <xsl:value-of select="format-number($ratio, '00.##')" />
            </ratio>
        </ratioline>
        </xsl:if>
    </xsl:for-each>
    </catalog>
</xsl:template>
</xsl:stylesheet>