如何替换xslt中的字符串

问题描述:

我是xslt的新手,并尝试使用xslt转换为xml以下。我正在尝试使用下面的xslt修改2个字段(一个是数字,另一个是字符串类型)。如何替换xslt中的字符串

<items> 
<item> 
    <item_id>27989498</item_id> 
    <service>Test Fee1</service> 
    <rate>350</rate> 
    <quantity>1</quantity> 
    <tax_rate>0</tax_rate> 
    <item_date>2010-11-17-05:00</item_date> 
</item> 
</items> 

XSLT:

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

<xsl:output method="xml" indent="yes"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="rate[ . &gt; 0 ]"> 
    <xsl:copy>100</xsl:copy> 
</xsl:template> 

<xsl:template match="service[ . &eq; 'Test Fee1' ]"> 
    <xsl:copy>T1</xsl:copy> 
</xsl:template> 

输出:

<items> 
<item> 
<item_id>27989498</item_id> 
<service>Test Fee1</service> 
<rate>100</rate> 
<quantity>1</quantity> 
<tax_rate>0</tax_rate> 
<item_date>2010-11-17-05:00</item_date> 
</item> 
</items> 

上面的XSLT被替换速度场正确,但对于字符串字段 “服务” 这不是更换预期值。如何比较和替换xslt中的字符串,因为“eq”方法不起作用。

是否可以从值列表中选择替换值而不是硬编码?实施例:测试FEE1 = T1,测试费用2 = T2,测试费用3 = T3等

更新

在请求XML服务标签将不会有来自系列的值,而不是这将是一个随机值,需要用一些国家的州名来替代,如国家代码应该被国家代码替代,而不考虑区分大小写。

示例:纽约= NY或纽约= NY,亚利桑那= AR等

+0

您以一种答案不再相应的方式改变了问题。请将它改回来,并扩大你的问题,而不是覆盖它。 –

+0

我已经更新了有关更改的问题,能否请您提供一种方法,以便与不区分大小写的情况进行比较,并从列表中选择值? – springbatcher

+0

@springbatcher最好接受这里给出的答案,并用新问题发布一个新问题。无论如何,我们需要知道您是使用XSLT 1.0还是XSLT 2.0。在询问XSLT时,请习惯于在xslt之外选择其中一个标签。 –

假设一个XSLT 1.0(或更高版本)处理器只需使用match="service[. = 'Test Fee1' ]"。使用XSLT 2.0处理器,您也可以使用match="service[. eq 'Test Fee1' ]"match="rate[ . &gt; 0 ]"也可以简化为match="rate[ . > 0 ]"

一个在XSLT 1.0非常简单的方法:

<xsl:template match="service[starts-with(., 'Test Fee') 
     and number(substring-after(., 'Test Fee')) &gt; 0]"> 
    <service> 
     <xsl:text>T</xsl:text> 
     <xsl:value-of select="substring-after(., 'Test Fee')"/> 
    </service> 
</xsl:template> 

这可能是进一步完善您的要求,具体取决于哪个值,您实际上是允许<服务>。