【问题标题】:Add Space in the XSLT V 1.0在 XSLT V 1.0 中添加空间
【发布时间】:2014-08-03 09:34:14
【问题描述】:

我在 XSLT 文件中有两个选择语句。我想要完成的是在 select 语句的输出中添加一个空格。

例如下面的代码:

<xsl:value-of select="translate(CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD1']/Value, ',',';')" />

返回这个输出:

9702195481; 31201(CCC代理)

我想在左括号前添加一个空格。所以输出将是:

9702195481; 31201(CCC 代理)

我尝试使用“翻译”功能,但它只允许两个输入。

第二条select语句:

<xsl:for-each select="/CAudioFile/Agent/GroupsList/int"><xsl:value-of select="@name"/></xsl:for-each> 

返回

53115(ABCDE 城市 IIM)

我想在第一个括号之前添加一个空格。所以输出是:

53115(ABCDE 城市 IIM)

有什么建议吗?

谢谢

编辑:

当我使用以下代码时,它在 99% 的时间里都能正常工作,并且它给了我想要的输出:

<xsl:variable name="cd1"    select="CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD1']/Value" />
<xsl:value-of select="translate(substring-before($cd1, '('), ',', ';')"/>
<xsl:text> (</xsl:text>
<xsl:value-of select="substring-after($cd1, '(')"/> 
<xsl:text>, </xsl:text>

输出是:

9702195481; 31201(CCC 代理)

但是,有时代码会返回稍微不同的输出:

9286136438; 31172(GCG代理)、18887113613

我希望这段代码用分号替换每个逗号,这个字符串的输出如下所示:

9286136438; 31172(GCG代理); 18887113613

这样我可以将它们放在一列中。

非常感谢您的帮助。

【问题讨论】:

  • 重新编辑:如果您使用已标记为已接受的答案,则不会发生这种情况 - 在拆分之前对整个值进行翻译。见:xsltransform.net/6qVRKvE/8

标签: xml xslt translate


【解决方案1】:

您不能使用 translate 将一个字符替换为两个。试试这个方法:

<xsl:variable name="value" select="CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD1']/Value" />

<xsl:value-of select="translate(substring-before($value, '('), ',', ';')"/>
<xsl:text> (</xsl:text>
<xsl:value-of select="substring-after($value, '(')"/>

或者,如果您愿意:

<xsl:value-of select="concat(translate(substring-before($value, '('), ',', ';'), ' (', substring-after($value, '('))"/>

【讨论】:

  • 谢谢。我得到了第一个工作,但是,我仍然对第二个有问题。我在 foreach 中有@name。 link
  • 我没有看到你有多个名字,那你为什么需要for-each? xsltransform.net/6qVRKvE/2 如果您确实希望有多个名称,那么 xsltransform.net/6qVRKvE/3
  • 知道了。但我对第一个有问题。我对 XML 文件没有任何控制。当我们将第一个 ',' 替换为 ';'它只做一次。但是,在某些情况下,它会在结束括号后添加另一个逗号。无论如何,用';'替换字符串中的所有','所以无论添加多少逗号,我仍然将这一列中的所有数据作为一列插入。这是minimal reproducible examplexsltransform.net/6qVRKvE/6
  • 对不起,我不明白这个问题。我建议您编辑您的问题并在那里发布代码 - 包括预期的结果。确保您还阐明了如何在结果中分隔不同的值 - 因为您在同一字符串中有一个“cd1”值和一个或多个“name”值。
【解决方案2】:

将您的值放在变量中,以便更容易重用:

<xsl:variable name="string"  
              select="translate(CAudioFile/CRI/PrivateData/PrivateData/DictionaryEntry[Key='CD1']/Value, ',',';')" />

您可以使用concat()substring() 函数:

concat( substring-before($string, '('), ' (', substring-after($string, '(') )

( 可以用作子字符串函数的分隔符,如果它出现不超过一次。这适用于 XSLT 1.0 或 +。

【讨论】:

  • 如何在 foreach 循环的变量中添加值?
  • 你不需要变量,因为它只是@name:&lt;xsl:value-of select="concat( substring-before(@name, '('), ' (', substring-after(@name, '(') )"/&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多