如何在xslt中替换字符串

时间:2016-12-06 13:08:59

标签: xml xslt

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

<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正在正确替换费率字段,但对于字符串字段&#34; service&#34;它没有取代预期的价值。如何比较和替换xslt中的字符串为&#34; eq&#34;方法不起作用。

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

更新

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

示例:New York = NY或new yoRk = NY,Arizona = AR等。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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>

这可以根据您的要求进一步细化,具体取决于您实际允许的&lt; service&gt;。