Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在xslt中如何将一个foreach变量的数据复制到另一个foreach变量_Xslt_Xslt 1.0 - Fatal编程技术网

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

在xslt中如何将一个foreach变量的数据复制到另一个foreach变量,xslt,xslt-1.0,Xslt,Xslt 1.0,XML 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:par

XML

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>
但上面显示的是错误的,因为变量名被声明在范围之外,所以任何修改都能使我到达那个输出吗

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

预期产量

O102N,000001,Praven,pravz,美国


O102N,000002,praveen,pubbypravz,UK

您能给我看一下您的输入xml和所需的输出xml吗

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

  <xsl:value-of select="concat($newtype,',',$first-val, ',',value)"/>
每个block4名称需要一行。因此,为block4/tag[name='77']应用一个模板

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

number将计算它选择的次数

实体项是用来控制空白的,否则格式就是垃圾

不需要付小费。希望这能有所帮助,XSLT是一种函数式语言——除其他外,这意味着变量是不可变的——一旦给定一个值,它们就不能更改

此特定问题的解决方案:

更改:

致:


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

@peter hancock感谢您的回复。。。。我已经用更简单的方式修改了,希望你现在能理解easily@pubby-但你明白吗;-@peter hancock是的,我知道了,谢谢你,但是这里如果你为任何一个标记重复提供的模板xslt是xml格式的,那就好了,如果像标记77一样,如果任何其他标记重复都意味着它不会正常工作?@pubby-不,这不会有任何区别。匹配规则特定于tag=77,任何其他标记都会随“全包”匹配一起被丢弃=text@peterhancock假设如果我在xml中再添加一个像77这样的标记,那么我们如何在xsl:template中为77和99提供一个条件来获取您的信息我已经编辑了上面的xml和预期的输出…您能给出任何建议吗请bosscan任何人给我一些建议请这是通过使用变量从一个for-each循环接收到的数据,该变量应该在另一个for-each循环中使用,这样我就可以实现我的预期输出我是xslt新手,所以请帮助我,因为缩进不好,您的代码无法读取。如果您需要我们的帮助,请让您的代码更易于阅读。@michael kay…我希望我的xml很清楚,我已经提交了到目前为止我所做的xslt,并且我提到了每个记录的预期输出,计数应该是递增的。如果有任何问题,请让我知道我会跟进您不知道这个concat$newtype有什么问题。。行是,但若我替换脚本中的concat$count,',',$first val,','值,它就可以工作到目前为止。关于您的记录计数器:我假设您希望它在每个for-each循环执行一个以上周期的情况下工作?这在纯XSLT中变得越来越困难。但要讨论这一点,您应该提供一个更好的输入数据示例。这仅在内部循环是唯一一个在多个周期中执行的循环时才起作用。但是我想这不是OP想要的。@DocBrown:我们不应该猜测——如果一个人不能定义他的问题,那么他就有更大的问题。
  <xsl:value-of select="concat($newtype,',',$first-val, ',',value)"/>
<?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>
<xsl:value-of select="concat($count,',',$first-val, ',',value)"/>
<xsl:value-of select="concat(position(),',',$first-val, ',',value)"/>