我有以下XML文件。
<xml>
<chapter>
<p>
<L-1>
This is a sample text. I want to <E type='bold'>display this text in bold.<E> This is good.
</L-1>
</p>
<figure>
</figure>
</chapter>
</xml>
现在我想编写一个xslt,它将使标记中包含的文本变为粗体。
期望的输出:
This is a sample text. I want to **display this text in bold.** This is good.
我正在写xsl-fo输出。 的 XSLT
<xml>
<xsl:template match="node()" mode="chapter">
<xsl:for-each select="node()">
<xsl:if test="current()[name() = 'P']">
<xsl:apply-templates select="current()[name() = 'P']"
mode="p" />
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="node()[name() = 'P']" mode="p">
<xsl:if test="current()/node()[name() = 'L-1']">
<xsl:apply-templates select="current()/node()[name() = 'L-1']"
mode="l1" />
</xsl:if>
</xsl:template>
<xsl:template match="node()[name() = 'L-1']" mode="l1">
<fo:block>
<xsl:value-of select="current()" />
</fo:block>
<xsl:if test="current()/node()[name() = 'E']">
<xsl:apply-templates select="current()/node()[name() = 'E']"
mode="e" />
</xsl:template>
<xsl:template match="node()[name() = 'E']" mode="e">
<fo:block font-weight="bold">
<xsl:value-of select="current()" />
</fo:block>
</xsl:template>
</xml>
阐释: 我必须实现遍历每个节点的递归方法。这种遍历必须是动态的。因为在任何时候我都不知道我会得到什么样的xml。在高层次上,我知道节点结构。我有xsd,其中定义了所有节点,子节点可以存在于父节点中。因此我的xslt在递归中运行以检查哪个是当前节点,并且基于我需要将样式应用于它。
现在使用上面的xslt,遇到“E”标记后,E标记后面的文字会出现两次。
当前输出: 这是一个示例文本。我想以粗体显示此文本。这很好。 以粗体显示此文字。
请建议我。
答案 0 :(得分:0)
假设您已经有一个正在转换文本的XSLT样式表,并且没有已经处理该特定节点的模板,您可以添加此模板(将E
的所有出现与包含type
属性的bold
匹配fo:block
),它将替换包含font-weight="bold"
属性的<xsl:template match="E[@type='bold']">
<fo:block font-weight="bold"><xsl:value-of select="."/></fo:block>
</xsl:template>
匹配:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/XMLFormat"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="p1"> <fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-name="p1">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="E[@type='bold']">
<fo:block font-weight="bold"><xsl:value-of select="."/></fo:block>
</xsl:template>
</xsl:stylesheet>
如果您根本没有XSLT模板并且上面的文字是您想要的,那么您可以使用此样式表生成包含所需转换的最小XSL-FO文件:
{{1}}
答案 1 :(得分:0)
作为我的XML的一部分,我有这样的东西:
Only for testing... I want to be <nmb_list_bold>bold</nmb_list_bold> and other want to be <nmb_list_italic>italic</nmb_list_italic>
无论文本到哪里,我都有<xsl:apply-templates/>
并且我添加了一些新模板,这些模板可以根据实例匹配您想要的任何东西:
<xsl:template match="nmb_list_bold">
<span style="font-weight:bold;">
<xsl:apply-templates/>
</span>
</xsl:template>
<xsl:template match="nmb_list_italic">
<span style="font-style:italic;">
<xsl:apply-templates />
</span>
</xsl:template>