使用xsl进行字符串处理:apply-templates

时间:2011-04-13 14:36:14

标签: xslt string line-breaks apply-templates preserve

我有一个看起来像这样的xml,

<Parent> Running text with marked up entities like 
  <Child>Entity1</Child> 
 and, text in the middle too, and
  <Child> Entity2 </Child>
</Parent>

我必须在渲染父级时保留换行符和缩进,但也要将突出显示模板应用于每个子标记。

现在,当我在变量中捕获父标记的内容以在XSL中执行某些字符串处理时,我失去了基础xml结构,并且无法将突出显示模板应用于子项。

然而,我无法想到保留父标记中包含的文本的换行符和缩进的任何其他方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:preserve-space elements="*"/>
    <xsl:template match="Parent">
        <div>
            <xsl:apply-templates mode="preserve"/>
        </div>
    </xsl:template>
    <xsl:template match="text()" mode="preserve" name="split">
        <xsl:param name="pString" select="."/>
        <xsl:choose>
            <xsl:when test="contains($pString,'&#xA;')">
                <xsl:value-of select="substring-before($pString,'&#xA;')"/>
                <br/>
                <xsl:call-template name="split">
                    <xsl:with-param name="pString"
                     select="substring-after($pString,'&#xA;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$pString"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="Child" mode="preserve">
        <b>
            <xsl:apply-templates mode="preserve"/>
        </b>
    </xsl:template>
</xsl:stylesheet>

输出:

<div> Running text with marked up entities like<br/> <b>Entity1</b><br/> and, text in the middle too, and<br/> <b> Entity2 </b><br/></div>

渲染为:

 运行带有标记实体的文本,例如
实体1
,以及中间的文本,以及实体2


修改:更好的例子,只保留空白文本节点。

答案 1 :(得分:0)

你没有显示任何代码,这使得你很难说出你做错了什么,但是一个常见的错误会解释所描述的症状是写

<xsl:variable name="x">
  <xsl:value-of select="some/node/path"/>
</xsl:variable>

你应该写的时候

<xsl:variable name="x" select="some/node/path"/>

将来,如果没有向我们展示您的代码,请不要告诉我们您的代码无效。