我是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[ . > 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等。
答案 0 :(得分:1)
假设使用XSLT 1.0(或更高版本)处理器,您只需使用match="service[. = 'Test Fee1' ]"
。使用XSLT 2.0处理器,您还可以使用match="service[. eq 'Test Fee1' ]"
。此外,match="rate[ . > 0 ]"
可以简化为match="rate[ . > 0 ]"
。
答案 1 :(得分:1)
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>
这可以根据您的要求进一步细化,具体取决于您实际允许的&lt; service&gt;。