我有以下xml:
<xml>
<start>
<p>Welcome</p>
<figure>
<graphic name="abc.svg"></graphic>
</figure>
<chapter>
<p>Sample text</p>
<figure>
<graphic name="one.svg"></graphic>
</figure>
<chapter>
<figure>
<graphic name="two.svg"></graphic>
</figure>
<p>Hello World</p>
</chapter>
<chapter>
<p>Life is good</p>
<figure>
<graphic name="three.svg"></graphic>
</figure>
</chapter>
</chapter>
</start>
</xml>
预期输出:
Welcome
abc.svg
Sample Text
one.svg
two.svg
Hello World
Life is good
three.svg
XSLT:
<?xml>
<xsl:apply-templates select="$context[name() = 'CHAPTER']" mode="chapter" />
<xsl:template match="node()" mode="chapter">
<xsl:for-each select="node()">
<fo:block margin-left="1mm">
<xsl:if test="name(./following-sibling::*) = 'figure'">
<xsl:apply-templates select="current()[name() = 'FIGURE']" mode="figure"
/>
</xsl:if>
<xsl:value-of select="current()" />
</fo:block>
</xsl:for-each>
</xsl:template>
<xsl:template match="node()[name() = 'figure']" mode="figure">
<xsl:variable name="ImageName">
<xsl:value-of
select="current()/L-GRAPHIC/GRAPHIC/@FILENAME" />
</xsl:variable>
<fo:block>
<fo:external-graphic>
<xsl:attribute name="src"> <xsl:value-of
select="concat('../resources/',
$ImageName)" /> </xsl:attribute>
</fo:external-graphic>
</fo:block>
</xsl:template>
问题: 使用上面的xslt(XPath)我得到以下输出:
Welcome
abc.svg
Sample Text
one.svg
Hello World
Life is good
最里面的嵌套图元素 two.svg和three.svg没有出现在输出中。但是文本来自任何层面。我有一个dtd文件,它定义了在chapter元素中可以有figure元素。但元素的顺序尚不清楚。 所以我正在检查它是否有一个数字元素,然后显示它。 我想要pdf格式的XSL FO输出。 XPath表达式名称中需要更多内容(./ following-sibling :: *)=&#39; figure&#39;。我没有得到它。 请帮帮我。
尝试了其他解决方案:
<xsl:if test="current()[name() = 'figure']"></xsl:if>
但只有第一个数字,abc.svg出现。 谢谢。
答案 0 :(得分:0)
您需要遵循的一般模式是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="//figure" />
</xsl:template>
<xsl:template match="figure">
<xsl:value-of select="preceding-sibling::p"/>
<xsl:value-of select="graphic/@name"/>
<xsl:value-of select="following-sibling::p"/>
</xsl:template>
</xsl:stylesheet>
如果你需要“装饰”段落(我使用HTML列表,但你可以在那里撒上你的FO),那么你需要条件格式化,使用它:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<ol>
<xsl:apply-templates select="//figure" />
</ol>
</xsl:template>
<xsl:template match="figure">
<xsl:if test="preceding-sibling::p">
<li>
<xsl:value-of select="preceding-sibling::p" />
</li>
</xsl:if>
<li>
<xsl:value-of select="graphic/@name" />
</li>
<xsl:if test="following-sibling::p">
<li>
<xsl:value-of select="following-sibling::p" />
</li>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
希望有所帮助。当你命名时,XSLT最有效,除非你必须
,否则不要继续使用node()