将以粗体标记括起的文本设为粗体

时间:2014-03-14 06:41:35

标签: xml xslt text

我有以下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标记后面的文字会出现两次。

当前输出:  这是一个示例文本。我想以粗体显示此文本。这很好。 以粗体显示此文字。

请建议我。

2 个答案:

答案 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>