XSLT按顺序选择元素

时间:2018-06-20 10:42:28

标签: xslt

<root>
    <label></label>
    <title></title>
    <p></p>
    <p></p>
    <list></list>
    <p></p>
    <p></p>
    <label></label>
    <list></list>
    <p></p>
    <p></p>
</root>

现在我要按顺序选择标签

像第一个标签,然后是标题,然后是两个p标签,然后列出是可能的

问题是当我用“。”选择标签<p>时。它列出了根

中的所有元素

我的XSLT是

<template match="root">
    <fo:block space-before="6pt" space-after="6pt" font-weight="bold">
        <xsl:value-of select="label" />
        <xsl:value-of select="title" />
    </fo:block>
    <fo:block>
        <xsl:for-each select="p">
            <fo:block space-before="6pt" space-after="6pt">
                <xsl:value-of select="." />
            </fo:block>
        </xsl:for-each>
    </fo:block>
    <fo:block>
        <xsl:for-each select="list/list-item">
            <fo:block>
                <fo:list-block provisional-distance-between-starts="3pc" provisional-label- separation="1pc">
                    <fo:list-item space-before="5pt" text-align="justify">
                        <fo:list-item-label>
                            <fo:block font-weight="bold" font-size="14pt">
                            </fo:block>
                        </fo:list-item-label>
                        <fo:list-item-body>
                            <fo:block text-align="justify" font-size="10pt" font-weight="normal">
                                <xsl:value-of select="label" />
                                <xsl:value-of select="p" />
                            </fo:block>
                        </fo:list-item-body>
                    </fo:list-item>
                </fo:list-block>
            </fo:block>
        </xsl:for-each>
    </fo:block>
</template>

1 个答案:

答案 0 :(得分:0)

听起来您可以从模板方法中受益。因此,为您要处理的每个元素都有一个模板。例如,用于转换p元素

<xsl:template match="p">
    <fo:block space-before="6pt" space-after="6pt">
        <xsl:value-of select="." />
    </fo:block>
</xsl:template>

然后,在与root匹配的模板中,您只需执行此操作即可依次选择节点

<xsl:apply-templates />

话虽如此,您似乎需要做更多工作才能将第一个titlelabel包装在一个块中,因此,您的root模板可能需要像这样,这使我们能够获得其余节点。

<xsl:template match="root">
    <fo:block space-before="6pt" space-after="6pt" font-weight="bold">
        <xsl:value-of select="label[1]" />
        <xsl:value-of select="title[1]" />
    </fo:block>
    <xsl:apply-templates select="*[position() > 2]" />
</xsl:template>

尝试此XSLT作为起点

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="fo" version="1.0">

<xsl:output method="xml" indent="yes" />

<xsl:template match="root">
    <fo:block space-before="6pt" space-after="6pt" font-weight="bold">
        <xsl:value-of select="label[1]" />
        <xsl:value-of select="title[1]" />
    </fo:block>
    <xsl:apply-templates select="*[position() > 2]" />
</xsl:template>

<xsl:template match="p">
    <fo:block space-before="6pt" space-after="6pt">
        <xsl:value-of select="." />
    </fo:block>
</xsl:template>

<xsl:template match="list">
    <fo:list-block provisional-distance-between-starts="3pc" provisional-label-separation="1pc">
        <xsl:for-each select="list-item">
            <fo:list-item space-before="5pt" text-align="justify">
                <fo:list-item-label>
                    <fo:block font-weight="bold" font-size="14pt">
                    </fo:block>
                </fo:list-item-label>
                <fo:list-item-body>
                    <fo:block text-align="justify" font-size="10pt" font-weight="normal">
                        <xsl:value-of select="label" />
                        <xsl:value-of select="p" />
                    </fo:block>
                </fo:list-item-body>
            </fo:list-item>
        </xsl:for-each>
    </fo:list-block>
</xsl:template>
</xsl:stylesheet>