我的xml如下:
<valid_path>
<document var_name="some_value">
<processControls>
<p>Lots of good text here ...</p>
<ul class="unIndentedList">
<li> Graphical display of system</li>
<li> Other bulleted items ...</li>
</ul>
<p>etc. etc. etc.</p>
</processControls>
</document>
</valid_path>
我的输入是由这个决定的:
<xsl:variable name="processControlsValue" select="/valid_path/document[@var_name='some_value']/processControls" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
我正在调用递归模板来替换在某些输入中找到的给定字符串。调用如下。
<xsl:call-template name="bulRep">
<xsl:with-param name="text" select="$processControlsValue"/>
<xsl:with-param name="replace" select="'Graphical'"/>
<xsl:with-param name="by" select="'foofoobars'"/>
</xsl:call-template>
这是模板。
<xsl:template name="bulRep">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="by"/>
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$by"/>
<xsl:call-template name="bulRep">
<xsl:with-param name="text" select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="by" select="$by"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
<!--<xsl:apply-templates select="$text" />-->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
该模板的工作原理是替换找到的文本。(例如,'Graphical' 确实被'foofoobars' 取代) 我遇到的问题是丢失了带有 value-of 或 copy-of 的格式。我意识到 value-of 将返回文本,而不是文本和格式,并且我发现许多帖子指示其他人使用 copy-of 来保留格式。但是,这不起作用。输出只是一个连续的文本行。
现在,如果我使用 apply-templates 行(当前已注释掉)而不是 value-of 行,并确保我点击了模板的“否则”部分,我会得到所需的输出。我会得到段落、项目符号列表等。但是使用 value-of 或 copy-of 只会获取文本,如果存在字符串匹配,使用 apply-templates 会中断。
我的最终结果是使用 xsl-fo 的 PDF。
我现在看到的:
这里有很多好文字... foofoobars 系统显示 其他项目符号... 等等 等等 等等
我想看到的:
这里有很多好文...
• foofoobars 系统显示
• 其他项目符号...
等等等等等等