如何一次连接两个以上的要求

时间:2011-06-06 07:54:16

标签: xslt xslt-1.0

大家好我根据一个要求在我的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,'&#13;'),'&#13;','~'))"/>
    <xsl:value-of select="concat(substring(value, 1, 5), ',',substring(substring-before(value,'&#13;'),6), ',',$del50k)" /> 
</xsl:template>

这样做是否正确?任何人都可以提供帮助

预期输出:

0101 /,0457887750,SAMAROCA~MENENDEZ Y PELAYO

2 个答案:

答案 0 :(得分:0)

您最大的问题是value是您的上下文节点(在模板的match属性中定义),但您在XPath中指的是value。这将在value节点中查找value节点,这显然是错误的。

<xsl:variable><xsl:value-of>语句中,将重新调整更改为value.,以改为引用当前节点。

我认为这可能不是唯一的问题,但鉴于您的模板无论如何都不会匹配该文档中的任何内容,因此很难找到可能出错的地方。一个可能的附加问题是,substring-before(value,'&#13;')中的<xsl:value-of>谓词不会返回任何格式,因为在0101/etc..之前有换行符。现在我考虑一下,这也是上一行substring-after中的问题。这非常依赖于它实际上是如何格式化的,但是根据你在这里给出的,这是一个问题。

答案 1 :(得分:0)

我根据您的输入给您一个完整的工作示例。几点说明:

  • 使用normalize-space()并按空格分割字符串。
  • 只需使用substring-beforesubstring-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="'&#x20;'"/>

    <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>