嗨,我已经在xslt代码中编写了一个基于需求的逻辑,一次连接两个以上的数据,但我没有达到预期的输出,任何人都能给出一些建议吗?
这是我的xml
<Swift>
<block4>
<tag>
<name>50K</name>
<value>
0101/0457887750
SAMAROCA
MENENDEZ Y PELAYO
</value>
</tag>
</block4>
</Swift>
我在这里写了一个xslt:
<xsl:template match="swift/message/block4/tag [name='50K']">
<xsl:variable name ="del50k" select ="(translate(substring-after(value,' '),' ','~'))"/>
<xsl:value-of select="concat(substring(value, 1, 5), ',',substring(substring-before(value,' '),6), ',',$del50k)" />
</xsl:template>
这样做对不对?有人能帮吗
预期输出:
0101/,0457887750,萨马罗卡~梅嫩德斯Y PELAYO
我将根据您的输入为您提供一个完整的工作示例。几个注意事项:
- 使用
normalize-space()
并按空格分隔字符串 - 只需玩
substring-before
和substring-after
- 确保使用
xsl:strip-space
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output omit-xml-declaration="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="space" select="' '"/>
<xsl:template match="block4/tag[name='50K']">
<xsl:variable name="value" select="normalize-space(value)"/>
<xsl:variable name="code" select="substring-before($value,$space)"/>
<xsl:variable name="string1" select="concat(
substring-before($code,'/'),
'/,',
substring-after($code,'/'))"/>
<xsl:variable name="string2" select="substring-before(
substring-after($value,$space),
$space)"/>
<xsl:variable name="string3" select="substring-after(
substring-after($value,$space),
$space)"/>
<xsl:value-of select="concat($string1,',',$string2,'~',$string3)"/>
</xsl:template>
<xsl:template match="name|value"/>
</xsl:stylesheet>
最大的问题是value
是上下文节点(在模板的match
属性中定义),但您在XPath中引用了value
。这将在value
节点中查找value
节点,这显然是错误的。
在<xsl:variable>
和<xsl:value-of>
语句中,将引用从value
更改为.
,以引用当前节点。
我认为这可能不是唯一的问题,但考虑到你的模板无论如何都不会匹配文档中的任何内容,很难推断出它可能出错的地方。一个可能的额外问题是,<xsl:value-of>
中的substring-before(value,' ')
谓词不会返回任何给定格式的内容,因为0101/etc..
之前有一个换行符。现在我想一想,这也是上一行substring-after
中的问题。这在很大程度上取决于它的实际格式,但从你在这里给出的内容来看,这是一个问题。