如何重新编号结果集中的筛选元素

时间:2011-08-16 05:29:23

标签: xslt

XML:

<?xml version="1.0" encoding="utf-8"?>
<book>
    <chapter>
        <section name="a">...</section>
        <section name="b">...</section>
        <section name="c">...</section>
        <section name="d">...</section>
        <section name="e">...</section>
        ...
    </chapter>
    <appendix>
        <section name="reference">...</section>
    </appendix>
</book>

嗨,我想输出sectionschapter个节点下的所有 appendix 。附录下的部分将打印出来。但是不是章节下的所有部分都允许打印,它们依赖于某些外部条件(如果部分名称在允许列表中从java应用程序传入)。

sections下的chapter也应该在部分名称之前输出正确的序列号,如下所示:

期望的结果

  1. b ...
  2. d ...
  3. (表示过滤掉a,c,e部分)

    我的问题是如何为//chapter/section生成上述所需的输出?任何提示或帮助都非常感谢

    我的XSL:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ex="http://example.com/namespace" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes"/>
    
        <xsl:param name="validChapters" />
    
        <xsl:function name="ex:isValidChapter" as="xs:boolean">
            <xsl:param name="str-in" as="xs:string"/>
            <xsl:choose>
                <xsl:when test="contains($validChapters, $str-in)">
                    <xsl:sequence select="true()" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:sequence select="false()" />
                </xsl:otherwise>
            </xsl:choose>
        </xsl:function>
    
        <xsl:template match="/">
            <xsl:apply-templates select="chapter" />
            <xsl:apply-templates select="appendix" />
        </xsl:template>
    
        <xsl:template match="chapter">
            ...
            <xsl:apply-templates select="section" />
        </xsl:template>
    
        <xsl:template match="appendix">
            ...
            <xsl:apply-templates select="section" />
        </xsl:template>
    
        <xsl:template match="section">
            ...
            <xsl:apply-templates />
        </xsl:template>
    
        <xsl:template match="//chapter/section">
            <xsl:if test="ex:isValidChapter(@name)">
                <fo:block>
                    <xsl:number format="1."/>
                    <xsl:value-of select="@name" />
                </fo:block>
                <xsl:apply-templates />
            </xsl:if>
        </xsl:template>
    
        ...
    </xsl:stylesheet>
    

1 个答案:

答案 0 :(得分:0)

答案只是为count=指令提供<xsl:number>属性:

        <xsl:number format="1." count="section[ex:isValidChapter(@name)]"/>

因此,在对章节进行编号时,只会计算“有效”的章节,因此编号将是正确的。

另请注意,您需要修改模板:

<xsl:template match="/">
    <xsl:apply-templates select="chapter" />

因为<chapter>不是根节点的子节点。 (它是文档元素的子元素<book>。)例如。

<xsl:template match="/book">
    <xsl:apply-templates select="chapter" />

此外,您的函数不需要选择/何时/否则将布尔结果转换为布尔值。它可以缩写为:

<xsl:function name="ex:isValidChapter" as="xs:boolean">
   <xsl:param name="str-in" as="xs:string"/>
   <xsl:sequence select="contains($validChapters, $str-in)"/>
</xsl:function>