根据条件生成序号

时间:2014-08-15 13:20:30

标签: xslt xslt-2.0

提前感谢您的支持,

我的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,则递增值。

请咨询

2 个答案:

答案 0 :(得分:2)

您可以使用xsl:number,例如:

<xsl:choose>
    <xsl:when test="4000 &lt;= offer-id and offer-id &lt; 5000">
        <xsl:number count="offer_info[4000 &lt;= offer-id and offer-id &lt; 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>