<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>
答案 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 />
话虽如此,您似乎需要做更多工作才能将第一个title
和label
包装在一个块中,因此,您的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>