如何替换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[ . > 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等
答
假设一个XSLT 1.0(或更高版本)处理器只需使用match="service[. = 'Test Fee1' ]"
。使用XSLT 2.0处理器,您也可以使用match="service[. eq 'Test Fee1' ]"
。 match="rate[ . > 0 ]"
也可以简化为match="rate[ . > 0 ]"
。
答
一个在XSLT 1.0非常简单的方法:
<xsl:template match="service[starts-with(., 'Test Fee')
and number(substring-after(., 'Test Fee')) > 0]">
<service>
<xsl:text>T</xsl:text>
<xsl:value-of select="substring-after(., 'Test Fee')"/>
</service>
</xsl:template>
这可能是进一步完善您的要求,具体取决于哪个值,您实际上是允许<服务>。
您以一种答案不再相应的方式改变了问题。请将它改回来,并扩大你的问题,而不是覆盖它。 –
我已经更新了有关更改的问题,能否请您提供一种方法,以便与不区分大小写的情况进行比较,并从列表中选择值? – springbatcher
@springbatcher最好接受这里给出的答案,并用新问题发布一个新问题。无论如何,我们需要知道您是使用XSLT 1.0还是XSLT 2.0。在询问XSLT时,请习惯于在xslt之外选择其中一个标签。 –