如何在XSLT中将一个foreach的变量数据复制到另一个变量的数据



XML

<swift>
 <message>
     <block2 type="input">
        <messageType>102</messageType>
        <receiverAddress>BKTRUS33XBRD</receiverAddress>
        <messagePriority>N</messagePriority>     
     </block2>
     <block3>
     <tag>
     <name>32</name>
     <value>praveen</value>
     </tag>
     <tag>
     <name>42</name>
     <value>pubby</value>
     </tag>
     </block3> 
     <block4>
     <tag>
     <name>77</name>
     <value>pravz</value>
     </tag>
     <tag>
     <name>77</name>
     <value>pubbypravz</value>
     </tag>
     <tag>
     <name>99</name>
     <value>USA</value>
     </tag>
     <tag>
     <name>99</name>
     <value>UK</value>
     </tag>
     <tag>
     <name>76</name>
     <value>shanmu</value>
     </tag>
  </block4>
 </message>
</swift>

XSL

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:output method="text" />
           <xsl:param name="count" select="000001"></xsl:param >
            <xsl:template match="/">
             <xsl:for-each select ="swift/message">
             <xsl:variable name="newtype">
        <xsl:choose>
        <xsl:when test="block2[@type = 'input']">
     <xsl:value-of  select=" concat('O', block2/messageType,block2/messagePriority )"/>,<xsl:text/>
            </xsl:when>
            <xsl:when test="block2[@type = 'output']">
     <xsl:value-of  select=" concat('I', block2/messageType,block2/messagePriority )"/>,<xsl:text/>
        </xsl:when>
           </xsl:choose>
            </xsl:variable>
    <xsl:for-each select ="/swift/message/block3/tag[name='32']">
    <xsl:variable name = "first-val" select="value"/>
    <xsl:for-each select ="/swift/message/block4/tag[name='77']">
    <xsl:value-of select="concat($count,',',$first-val, ',',value)"/>
    <xsl:text>
        </xsl:text>
         </xsl:for-each>
       </xsl:for-each>
    </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

我需要复制其中的数据,我已经声明了"Newtype"的名称,需要数据来代替这个波纹管线

  <xsl:value-of select="concat($newtype,',',$first-val, ',',value)"/>

但是上面显示错误,因为变量名称被声明在范围之外,所以任何修改都可以让我达到那个输出吗

以上我已经热编码了这个值000001但每条记录都需要增量

预期输出

O102N,000001,普拉文,普拉夫兹,美国

O102N,000002, 普拉文,普比普拉夫兹,英国

你能告诉我你的输入xml和所需的输出xml吗?

当我在 xsl 中看到 foreach 时,我有点畏缩 - 它是一种模板语言,很少需要 foreach......

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE stylesheet [
    <!ENTITY comma "<xsl:text>,</xsl:text>">
    <!ENTITY cr "<xsl:text>
</xsl:text>">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="text" indent="no" />
    <xsl:template match="/">
        <xsl:apply-templates select="/swift/message/block4/tag [name='77']"/>
    </xsl:template>
    <xsl:template match="message/block4/tag [name='77']">
        <xsl:apply-templates select="../../block2/@type"/>
        <xsl:value-of select="../../block2/messageType"/>
        <xsl:value-of select="../../block2/messagePriority"/>&comma;
        <xsl:number format="000001"/>&comma;
        <xsl:value-of select="../../block3/tag [name='32']/value"/>&comma;
        <xsl:value-of select="value"/>&cr;
    </xsl:template>
    <xsl:template match="@type[.='input']">O</xsl:template>
    <xsl:template match="@type[.='output']">I</xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

每个 block4 名称需要一行。 因此,请为该块4/标签应用模板 [name='77']

然后 - 对于其中的每一个,选择您需要的父元素。

xsl:Number 将计算它选择的次数。

实体项用于控制空格 - 否则格式是垃圾。

不需要一分钱。 希望这有帮助

XSLT是一种函数式语言 - 除其他外,这意味着变量是不可变的 - 一旦给定一个值,它们就无法更改。

此特定问题的解决方案

更改

<xsl:value-of select="concat($count,',',$first-val, ',',value)"/>

<xsl:value-of select="concat(position(),',',$first-val, ',',value)"/>

将更正后的转换应用于提供的 XML 文档时,将生成所需的结果

相关内容

  • 没有找到相关文章

最新更新