我试图根据节点中的第一个元素将所有相同的 AsstTp 组合在一起。因此,所有 Scty 元素都在一个 AsstTp 元素下,所有 Csh 元素都在另一个 AsstTp 元素下。如下:
<RpTrad>
<AsstTp>
<Scty>
<Id>
<Id>GB00B3KJDQ49</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="EUR">1000000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
</AsstTp>
<AsstTp>
<Scty>
<Id>
<Id>GB00B3KJDP50</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="GBP">1100000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
</AsstTp>
<AsstTp>
<Scty>
<Id>
<Id>GB00B3KJDR51</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="CHF">1200000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
</AsstTp>
<AsstTp>
<Csh>
<Id>
<Id>US1234567890</Id>
<ClssfctnTp>EABCDE</ClssfctnTp>
<QtyOrNmnlVal>
<Qty>10000</Qty>
</QtyOrNmnlVal>
</Id>
</Csh>
</AsstTp>
</RpTrad>
应该变成...
<RpTrad>
<AsstTp>
<Scty>
<Id>
<Id>GB00B3KJDQ49</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="EUR">1000000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
<Scty>
<Id>
<Id>GB00B3KJDP50</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="GBP">1100000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
<Scty>
<Id>
<Id>GB00B3KJDR51</Id>
<ClssfctnTp>DBADGC</ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal Ccy="CHF">1200000</NmnlVal>
</QtyOrNmnlVal>
</Id>
</Scty>
</AsstTp>
<AsstTp>
<Csh>
<Id>
<Id>US1234567890</Id>
<ClssfctnTp>EABCDE</ClssfctnTp>
<QtyOrNmnlVal>
<Qty>10000</Qty>
</QtyOrNmnlVal>
</Id>
</Csh>
</AsstTp>
</RpTrad>
我目前正在尝试使用以下 XSLT,但它似乎只是重复了我 4 次:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common">
<xsl:key name="Coll-by-AsstTp" match="AsstTp" use="local-name()" />
<xsl:template match="RpTrad">
<xsl:for-each select="AsstTp[count(. | key('Coll-by-AsstTp', local-name())[1]) = 1]">
<xsl:for-each select="key('Coll-by-AsstTp', local-name())">
<xsl:copy-of select="/node()" />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
所以我相信创建我的密钥和使用 local-name() 函数没有获取它需要的正确元素值有问题。从而导致 for 循环运行多次并且不会更深入地仅复制每个 AsstTp 的内部节点。
提前致谢,扫罗
您想AsstTp
按其子元素的名称对元素进行分组- 因此您的键应定义为:
<xsl:key name="asstTp-by-child" match="AsstTp" use="local-name(*)" />
然后:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="asstTp-by-child" match="AsstTp" use="local-name(*)" />
<xsl:template match="/RpTrad">
<xsl:copy>
<xsl:for-each select="AsstTp[count(. | key('asstTp-by-child', local-name(*))[1]) = 1]">
<xsl:copy>
<xsl:copy-of select="key('asstTp-by-child', local-name(*))/*"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
将返回您想要的结果。
注意:
指令:
<xsl:copy-of select="/node()" />
将复制整个 XML 文档,从根节点开始,无论当前上下文如何。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句