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>
嗨,我想输出sections
和chapter
个节点下的所有 appendix
。附录下的部分将打印出来。但是不是章节下的所有部分都允许打印,它们依赖于某些外部条件(如果部分名称在允许列表中从java应用程序传入)。
sections
下的chapter
也应该在部分名称之前输出正确的序列号,如下所示:
期望的结果
(表示过滤掉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>
答案 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>