提前感谢您的支持,
我的xslt应该在执行期间生成以下xml格式,
<offers_list>
<offer_info>
<offer-id>4001</offer-id>
<offer-counter>1</offer-counter>
<offer_info>
<offer_info>
<offer-id>4897</offer-id>
<offer-counter>2</offer-counter>
<offer_info>
<offer_info>
<offer-id>3001</offer-id>
<offer-counter>0</offer-counter>
<offer_info>
<offer_info>
<offer-id>4567</offer-id>
<offer-counter>3</offer-counter>
<offer_info>
<offer_info>
<offer-id>1001</offer-id>
<offer-counter>0</offer-counter>
<offer_info>
</offers_list>
我已经完成了几乎所有事情,但是如何根据条件在<offer-counter>
标签中生成序列计数器?条件是,如果offer-id值的范围是4000到5000,则递增值。
请咨询
答案 0 :(得分:2)
您可以使用xsl:number
,例如:
<xsl:choose>
<xsl:when test="4000 <= offer-id and offer-id < 5000">
<xsl:number count="offer_info[4000 <= offer-id and offer-id < 5000]"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
以上适用于XSLT 1.0和2.0。
答案 1 :(得分:1)
您没有提供足够的信息,但我做了一些猜测。您的XML格式不正确,因为offer_info
元素永远不会关闭。我使用了以下输入:
XML输入
<?xml version="1.0" encoding="UTF-8"?>
<offers_list>
<offer_info>
<offer-id>4001</offer-id>
</offer_info>
<offer_info>
<offer-id>4897</offer-id>
</offer_info>
<offer_info>
<offer-id>3001</offer-id>
</offer_info>
<offer_info>
<offer-id>4567</offer-id>
</offer_info>
<offer_info>
<offer-id>1001</offer-id>
</offer_info>
</offers_list>
<强>样式表强>
样式表的关键部分,除了身份模板之外:
<xsl:when test="4000 le xs:integer(offer-id) and xs:integer(offer-id) le 5000">
<xsl:value-of select="count(preceding::offer-id[4000 le xs:integer(.) and xs:integer(.) le 5000]) + 1"/>
</xsl:when>
第一行测试offer-id
值是否在4000到5000之间(或者恰好是其中一个数字)。要进行比较,必须将offer-id
的字符串值强制转换为xs:integer
类型。然后,计算满足条件的所有前面的offer-id
元素。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="offer_info">
<xsl:copy>
<xsl:apply-templates/>
<offer-counter>
<xsl:choose>
<xsl:when test="4000 le xs:integer(offer-id) and xs:integer(offer-id) le 5000">
<xsl:value-of select="count(preceding::offer-id[4000 le xs:integer(.) and xs:integer(.) le 5000]) + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</offer-counter>
</xsl:copy>
</xsl:template>
</xsl:transform>
XML输出
<?xml version="1.0" encoding="UTF-8"?>
<offers_list>
<offer_info>
<offer-id>4001</offer-id>
<offer-counter>1</offer-counter>
</offer_info>
<offer_info>
<offer-id>4897</offer-id>
<offer-counter>2</offer-counter>
</offer_info>
<offer_info>
<offer-id>3001</offer-id>
<offer-counter>0</offer-counter>
</offer_info>
<offer_info>
<offer-id>4567</offer-id>
<offer-counter>3</offer-counter>
</offer_info>
<offer_info>
<offer-id>1001</offer-id>
<offer-counter>0</offer-counter>
</offer_info>
</offers_list>