我正在处理一个非常奇怪的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>
答案 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>