使用XSL 1.0替换字符串

时间:2014-05-29 19:19:20

标签: xml xslt xslt-1.0 xls

我在使用XSL 1.0替换字符串中的字符串时遇到了一些问题。我已经阅读了本网站和其他网站上的各种主题,但我无法理解为什么我的方法无效。出于这个问题的目的,我对数据进行了一些贬低,但是你希望得到这个数据。

所以,我得到了我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="replaceAString.xsl"?>
<Body>
    <aString>textToReplace</aString>
</Body>

和XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <h1>
       <xsl:value-of select="$myVar"/>
    </h1>
</xsl:template>

<xsl:variable name="myVar">
    <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="Body/aString/" />
        <xsl:with-param name="replace" select="'textToReplace'" />
        <xsl:with-param name="by" select="'withThisText'" />
    </xsl:call-template>
</xsl:variable>

<xsl:template name="string-replace-all">
    <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:with-param name="text" select="substring-after($text,$replace)"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text" />
        </xsl:otherwise>
     </xsl:choose>
     </xsl:template>
    </xsl:stylesheet>

我希望这次改造的结果是文本&#34; withThisText&#34;出现在heading1 HTML标记内。不幸的是,我什么都没收到。这是我似乎无法弄清楚我的逻辑有什么问题的事情之一。我没有XML / XSL专业人士,但我也不是一个完整的新手。虽然我确定现在有人会对此表示赞同:P

任何帮助将不胜感激!我真的卡在这里:(

非常感谢,

詹姆斯

2 个答案:

答案 0 :(得分:4)

是的,我已经对它们进行了排序!我的替换模板略有不正确,我必须承认,所以感谢你指出这一点。感谢@helderdarocha建议我使用控制台进行故障排除。我这样做了,发现很多Stylesheet甚至无法解析!这个问题的原因是什么?看看我的xmlns:xsl命名空间声明;没有&#34; www。&#34;。通过更正和更改我的代码,替换功能现在正在处理:)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="**http://www.w3.org/1999/XSL/Transform**">

<xsl:variable name="myVar">
    <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="Body/aString" />
        <xsl:with-param name="replace" select="'textToReplace'" />
        <xsl:with-param name="by" select="'withThisText'" />
    </xsl:call-template>
</xsl:variable>

<xsl:template match="/">
    <h1>
        <xsl:value-of select="$myVar"/>
    </h1>
</xsl:template>

<xsl:template name="string-replace-all">
    <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="string-replace-all">
                <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:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

非常感谢!!

问候,

詹姆斯

答案 1 :(得分:1)

首先,改变:

<xsl:with-param name="text" select="Body/aString/" />

为:

<xsl:with-param name="text" select="Body/aString" />

接下来,请注意您在第一个<xsl:when>内:

<xsl:with-param name="text" select="substring-after($text,$replace)"/>

我认为这需要成为<xsl:call-template>

的一部分