【问题标题】:xsl : how to translate or replace string?xsl:如何翻译或替换字符串?
【发布时间】:2012-09-12 05:33:19
【问题描述】:

我的 xsl 变量:

<xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>

我需要从以下位置翻译或替换string 变量数据:

Satur - Sun - Mon - Tues - Wednes - Thurs - Fri

所以,输出应该是这样的:

Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday

..................

@马德斯·汉森
我是xslxml 的新手,我尝试了你的代码,但它不起作用
100% 这是错误的

我的 xsl 文件:

    <xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>
    <xsl:template match="/">
        <html>
            <body>
                <h2>result: </h2>
                <xsl:value-of 
                    select="for $token in tokenize($string, '\s-\s') 
                            return(
                                document('')/*/config/replacement[find[.=$token]]/replace,             
                                $token
                            )[1]" 
                    separator=" - "
                />
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

我的 xml 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
    <config>
       <replacement>
            <find>Satur</find>
            <replace>Saturday</replace>
        </replacement>
        <replacement>
            <find>Sun</find>
            <replace>Sunday</replace>
        </replacement>
        <replacement>
            <find>Mon</find>
            <replace>Monday</replace>
        </replacement>
        <replacement>
            <find>Tues</find>
            <replace>Tuesday</replace>
        </replacement>
        <replacement>
            <find>Wednes</find>
            <replace>Wednesday</replace>
        </replacement>
        <replacement>
            <find>Thurs</find>
            <replace>Thursday</replace>
        </replacement>
        <replacement>
            <find>Fri</find>
            <replace>Friday</replace>
        </replacement>
    </config>

我的代码有什么问题?

【问题讨论】:

  • 您提到它不起作用,但没有告诉我们它在做什么不符合您的期望。是不是报错了?
  • 如果您试图通过在浏览器中加载 XML 来执行转换,它将不起作用。浏览器不支持 XSLT 2.0
  • 由于您将配置元素从 XSLT 中移出并移到源 XML 中,因此您可以。需要调整 XPath 以移除“document('')/*”。

标签: xml string xslt replace translate


【解决方案1】:

我。 XPath 2.0 (XSLT 2.0) 解决方案

使用以下 XPath 2.0 单线

concat(replace(.,'\s+-\s*', 'day - '), 'day')

基于 XSLT 的验证

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="/*">
   <xsl:sequence select="concat(replace(.,'\s+-\s*', 'day - '), 'day')"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时:

<t>Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</t>

产生想要的正确结果

Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday

二。 XSLT 1.0 解决方案:

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

 <xsl:template match="/*">
      <xsl:call-template name="replace">
       <xsl:with-param name="pS" select=
       "concat(normalize-space(translate(., '-', ' ')), 'day')"/>
     </xsl:call-template>
 </xsl:template>

 <xsl:template name="replace">
  <xsl:param name="pS"/>
  <xsl:param name="pTarget" select="' '"/>
  <xsl:param name="pReplacement" select="'day - '"/>

  <xsl:if test="$pS">
   <xsl:value-of select="substring-before(concat($pS,$pTarget), $pTarget)"/>
   <xsl:if test="contains($pS, $pTarget)">
     <xsl:value-of select="$pReplacement"/>
   </xsl:if>
   <xsl:call-template name="replace">
     <xsl:with-param name="pS" select="substring-after($pS, $pTarget)"/>
     <xsl:with-param name="pTarget" select="$pTarget"/>
     <xsl:with-param name="pReplacement" select="$pReplacement"/>
   </xsl:call-template>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于同一个 XML 文档(上图)时,会产生相同的正确结果

Saturday - Sunday - Monday - Tuesday - Wednesday - Thursday - Friday

【讨论】:

  • 它有效.. 但是,您只在replacement word 的末尾添加了day word 以使Satur 成为Saturday 但是,法语的日子怎么样? ??? 感谢您的代码和帮助,但这不是我需要的解决方案.. +1
  • @al-dr,这是对您的问题的完整和正确的答案 - 它以当前形式定义的方式。请更新问题,或者更好的是,提出一个新问题。人们不必猜测您未指定的内容。
【解决方案2】:

XSLT 2.0 解决方案:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"
    xmlns:my="http://stackoverflow.com/questions/12502665/xsl-how-to-translate-or-replace-string">
    <xsl:output indent="yes"/>

    <xsl:variable name="string">Satur - Sun - Mon - Tues - Wednes - Thurs - Fri</xsl:variable>

    <my:config>
        <replacement>
            <find>Satur</find>
            <replace>Saturday</replace>
        </replacement>
        <replacement>
            <find>Sun</find>
            <replace>Sunday</replace>
        </replacement>
        <replacement>
            <find>Mon</find>
            <replace>Monday</replace>
        </replacement>
        <replacement>
            <find>Tues</find>
            <replace>Tuesday</replace>
        </replacement>
        <replacement>
            <find>Wednes</find>
            <replace>Wednesday</replace>
        </replacement>
        <replacement>
            <find>Thurs</find>
            <replace>Thursday</replace>
        </replacement>
        <replacement>
            <find>Fri</find>
            <replace>Friday</replace>
        </replacement>
    </my:config>

    <xsl:template match="/">
        <xsl:value-of 
              select="for $token in tokenize($string, '\s-\s') 
                        return
                         (
                          document('')/*/my:config/replacement[find[.=$token]]/replace,             
                          $token
                         )[1]" 
              separator=" - " />
    </xsl:template>

</xsl:stylesheet>

【讨论】:

  • 我是xslxml 的新手,我尝试了你的代码,但它不起作用100% 这是错误的我将把我的代码放在这里 我的 xsl 文件:
【解决方案3】:

@Mads 答案的变体:

<xsl:template match="/">
  <xsl:value-of 
     select="for $token in tokenize($string, '\s-\s') 
        return concat($token, 'day')"
     separator=" - " />
</xsl:template>

那么你可以省略&lt;my:config&gt;

【讨论】:

  • @al-dr:用上面的模板替换 Mads 的模板,删除整个 &lt;my:config&gt; 块,其他一切保持不变。但是,如果您需要法语或多种语言的日子,请使用 Mads 的解决方案,而不是这个。
猜你喜欢
  • 2011-10-20
  • 2018-08-03
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多