XSLT列表编号

时间:2015-08-26 13:19:25

标签: xslt

列表编号问题我正在摔跤。有时列表有一个特定的起始编号,有时它不会。这里有一些xml

<document>
    <OrderedList Style="LowerAlpha">
    <Li><Para>Level 1, item 1</Para></Li>
      <Li><Para>Level 1, item 2</Para>
         <OrderedList Style="LowerRoman" StartAt="3">
            <Li><Para>Level 2, item 1</Para></Li>
            <Li><Para>Level 2, item 2</Para></Li>
         </OrderedList>
      </Li>
   </OrderedList>
</document>

我希望我的输出是

一个。清单1 湾清单1 III。清单2 IV。清单2

当我没有使用以下xslt的起始编号时,我能够完美编号

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
       <xsl:template match="/">
          <root>
             <xsl:apply-templates/>
          </root>
       </xsl:template>
       <xsl:template match="OrderedList">
          <xsl:apply-templates/>
       </xsl:template>
       <xsl:template match="Li">
          <Para>
             <xsl:variable name="liCount" select="count(preceding-sibling::Li)+1"/>
             <xsl:choose>
                <xsl:when test="../@Style='LowerAlpha'">
                   <xsl:number format="a." value="$liCount"/>
                </xsl:when>
                <xsl:when test="../@Style='UpperAlpha'">
                   <xsl:number format="A." value="$liCount"/>
                </xsl:when>
                <xsl:when test="../@Style='LowerRoman'">
                   <xsl:number format="i." value="$liCount"/>
                </xsl:when>
                <xsl:when test="../@Style='UpperRoman'">
                   <xsl:number format="I." value="$liCount"/>
                </xsl:when>
                <xsl:otherwise>
                   <xsl:number format="1." value="$liCount"/>
                </xsl:otherwise>
             </xsl:choose>
             <xsl:apply-templates/>
          </Para>
       </xsl:template>
    </xsl:stylesheet>

我已尝试在编号中添加StartAt的属性值,这在实际定义StartAt时有效,但在未定义StartAt时输出为NaN。 <xsl:variable name="liCount" select="count(preceding-sibling::Li)+number(../@StartAt)"/>

我需要使变量select语句以是否存在StartAt属性为条件,不确定是否可行。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

你可以这样对待它。

<xsl:variable name="liCount">
  <xsl:choose>
    <xsl:when test="number(../@StartAt)">
      <xsl:value-of select="count(preceding-sibling::Li) + number(../@StartAt)"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="count(preceding-sibling::Li)"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:variable>

我经常遇到这个问题,我写了一个名为“force-number()”的函数并将其添加到我的XSLT实用程序include中。如果您有EXSLT功能支持,则可能需要考虑此选项。