XSL 1.0如何在字符串中替换两个不同的东西

时间:2013-12-12 14:58:40

标签: xslt xslt-1.0

我有一个字符串,可以有换行符和撇号。我需要替换两者。我有以下xsl代码:

<xsl:call-template name="replaceapostrophes">
<xsl:with-param name="string">
    <xsl:call-template name="replacelinefeeds">
        <xsl:with-param name="string" select="hl7:text/hl7:paragraph"/>
    </xsl:call-template>
</xsl:with-param>
</xsl:call-template>

    <!-- template for replacing line feeds with <br> tags for page display -->
<xsl:template name="replacelinefeeds">
    <xsl:param name="string"/>
    <xsl:choose>
        <xsl:when test="contains($string,'&#10;')">
            <xsl:value-of select="substring-before($string,'&#10;')"/>
            <br/>
            <xsl:call-template name="replacelinefeeds">
                <xsl:with-param name="string" select="substring-after($string,'&#10;')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$string"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<!-- template for replacing html encoded apostrophes for page display -->
<xsl:template name="replaceapostrophes">
    <xsl:param name="string"/>
    <xsl:choose>
        <xsl:when test="contains($string, '&amp;#39;')">
            <xsl:value-of select="substring-before($string,'&amp;#39;')"/>'<xsl:call-template name="replaceapostrophes">
                <xsl:with-param name="string" select="substring-after($string,'&amp;#39;')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$string"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

这是xml代码:

<text>
  <paragraph>Adding apostrophe to the patient&amp;#39;s instructions
  and checking for a second line</paragraph>
</text>

然而,当这个运行时,我会得到撇号,但不是换行符。

Adding apostrophe to the patient's instructions and checking for a second line

而不是

Adding apostrophe to the patient's instructions
and checking for a second line

如果在同一个字符串中有一个或另一个但不是两个都可以正常工作。

我需要采用不同的方式吗?

由于

2 个答案:

答案 0 :(得分:1)

反过来使用模板,即首先替换撇号,然后换行。并确保在输出时使用xsl:copy-of而不是xsl:value-of替换换行符的结果,否则br元素将丢失。如果您有<xsl:variable name="text"><xsl:call-template name="replacelinefeeds">..</xsl:call-template></xsl:variable>,请务必使用<xsl:copy-of select="$text"/>

答案 1 :(得分:1)

尝试相反的方法(首先替换撇号,然后换行)。

基本上,您将HTML <br/>元素放入变量中,然后使用其文本值替换撇号,从而再次删除换行符。