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,普利文,pravz,USA
O102N,000002,praveen,pubbypravz,英国
答案 0 :(得分:0)
你能告诉我你输入的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"/>,
<xsl:number format="000001"/>,
<xsl:value-of select="../../block3/tag [name='32']/value"/>,
<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名称需要一行。因此,为该block4 / tag [name = '77']
应用模板然后 - 对于其中每一个,选择您需要的父元素。
xsl:number将计算它所选择的次数。
ENTITY项目用于控制空格 - 否则格式化为废话。
不需要foreach。希望这有帮助
答案 1 :(得分:0)
XSLT是一种函数式语言 - 除其他外,这意味着变量是不可变的 - 一旦给定值,就无法更改。
针对此特定问题的解决方案:
更改强>:
<xsl:value-of select="concat($count,',',$first-val, ',',value)"/>
要强>:
<xsl:value-of select="concat(position(),',',$first-val, ',',value)"/>
将更正后的转换应用于提供的XML文档时,生成所需结果。