分组后的 XSLT 1.0 循环元素
XSLT 1.0 loop elements after grouping
我需要你的帮助来解决 XSLT 1.0 问题。
原文XML:
<businessevent>
<catalog>
<de name="16R">FIN</de>
<ds name="35B">
<de name="instrument_identification">ISIN AT0000A0U3T4</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0U3T4</de>
<de name="instrument_code_code">AT0000A0U3T4</de>
<de name="instrument_code_umi_id">ATG2022113.4</de>
<de name="instrument_code_code">AT0000A0U3T4</de>
<de name="instrument_code_umi_id">ATG2022113.4_SG</de>
</ds>
<de name="16R">FIA</de>
<de name="12A">:CLAS/ISIT/GOVT</de>
<ds name="98A">
<de name="date_type">MATU</de>
<de name="date">20051122</de>
</ds>
<ds name="98A">
<de name="date_type">ISSU</de>
<de name="date">20060126</de>
</ds>
<de name="92A">:INTR//3,4</de>
<de name="16S">FIA</de>
<de name="90A">:MRKT//PRCT/114,16</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<ds name="93B">
<de name="amount_type">AVAI</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<ds name="93B">
<de name="amount_type">NAVL</de>
<de name="unit_type">FAMT</de>
<de name="amount">0</de>
</ds>
<de name="16R">SUBBAL</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<de name="16S">SUBBAL</de>
<de name="19A">:HOLD//EUR6000,</de>
<de name="16S">FIN</de>
<de name="16R">FIN</de>
<ds name="35B">
<de name="instrument_identification">ISIN AT0000A0VRF9</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0VRF9</de>
<de name="instrument_code_code">AT0000A0VRF9</de>
<de name="instrument_code_umi_id">ATG2019061.95</de>
</ds>
<de name="16R">FIA</de>
<de name="12A">:CLAS/ISIT/GOVT</de>
<ds name="98A">
<de name="date_type">MATU</de>
<de name="date">20120618</de>
</ds>
<ds name="98A">
<de name="date_type">ISSU</de>
<de name="date">20110703</de>
</ds>
<de name="92A">:INTR//1,95</de>
<de name="16S">FIA</de>
<de name="90A">:MRKT//PRCT/100,47</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<ds name="93B">
<de name="amount_type">AVAI</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<ds name="93B">
<de name="amount_type">NAVL</de>
<de name="unit_type">FAMT</de>
<de name="amount">0</de>
</ds>
<de name="16R">SUBBAL</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<de name="16S">SUBBAL</de>
<de name="19A">:HOLD//EUR1000,</de>
<de name="16S">FIN</de>
</catalog>
</businessevent>
如您所见,它是一个扁平的 XML,结构怪异,我只能使用 XSLT 1.0 来操作它。子结构重复启动
<de name="16R">FIN</de>
并以
结尾
<de name="16S">FIN</de>
对于这个重复结构中的每一个,我需要获取一些信息,并且只需要获取第一次出现的 93B 且 amount_type = AGGR。在第一个 "group" 它重复并给我带来问题。
预期结果:
<businessevent>
<catalog>
<ds>
<de name="instrument_identification">ISIN AT0000A0U3T4</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0U3T4</de>
<de name="amount">100</de>
</ds>
</catalog>
</businessevent>
非常感谢!
根据您之前的问题,您仍然可以使用以下键来执行 "group-starting-with" 的形式:
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
要获得您想要的前三个元素,在“35B”中,您可以这样做...
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
并获得第一个“93B”元素,amount_type of "AGGR" 你可以这样做:
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
这样试试...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:for-each select="de[@name='16R'][. = 'FIN']">
<group>
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
</group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="ds" mode="ds-35B">
<xsl:apply-templates select="de[@name='instrument_identification' or @name='instrument_type' or @name='instrument_code']" />
</xsl:template>
<xsl:template match="ds" mode="ds-93B">
<xsl:apply-templates select="de[@name='amount']" />
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<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="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:apply-templates select="@* | node()"/>
</xsl:template>
<xsl:template match="businessevent">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:apply-templates select="@*|de[@name='16R' and . = 'FIN']"/>
</xsl:copy>
</xsl:template>
<xsl:template match="de[@name='16R' and . = 'FIN']">
<xsl:apply-templates select="following-sibling::ds[@name='35B'][1]"/>
</xsl:template>
<xsl:template match="ds[@name='35B']">
<xsl:copy>
<xsl:copy-of select="de[@name='instrument_identification']"/>
<xsl:copy-of select="de[@name='instrument_type']"/>
<xsl:copy-of select="de[@name='instrument_code']"/>
<xsl:copy-of select="following-sibling::ds[de[@name='amount_type' and . = 'AGGR']][1]/de[@name='amount']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我需要你的帮助来解决 XSLT 1.0 问题。
原文XML:
<businessevent>
<catalog>
<de name="16R">FIN</de>
<ds name="35B">
<de name="instrument_identification">ISIN AT0000A0U3T4</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0U3T4</de>
<de name="instrument_code_code">AT0000A0U3T4</de>
<de name="instrument_code_umi_id">ATG2022113.4</de>
<de name="instrument_code_code">AT0000A0U3T4</de>
<de name="instrument_code_umi_id">ATG2022113.4_SG</de>
</ds>
<de name="16R">FIA</de>
<de name="12A">:CLAS/ISIT/GOVT</de>
<ds name="98A">
<de name="date_type">MATU</de>
<de name="date">20051122</de>
</ds>
<ds name="98A">
<de name="date_type">ISSU</de>
<de name="date">20060126</de>
</ds>
<de name="92A">:INTR//3,4</de>
<de name="16S">FIA</de>
<de name="90A">:MRKT//PRCT/114,16</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<ds name="93B">
<de name="amount_type">AVAI</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<ds name="93B">
<de name="amount_type">NAVL</de>
<de name="unit_type">FAMT</de>
<de name="amount">0</de>
</ds>
<de name="16R">SUBBAL</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">100</de>
</ds>
<de name="16S">SUBBAL</de>
<de name="19A">:HOLD//EUR6000,</de>
<de name="16S">FIN</de>
<de name="16R">FIN</de>
<ds name="35B">
<de name="instrument_identification">ISIN AT0000A0VRF9</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0VRF9</de>
<de name="instrument_code_code">AT0000A0VRF9</de>
<de name="instrument_code_umi_id">ATG2019061.95</de>
</ds>
<de name="16R">FIA</de>
<de name="12A">:CLAS/ISIT/GOVT</de>
<ds name="98A">
<de name="date_type">MATU</de>
<de name="date">20120618</de>
</ds>
<ds name="98A">
<de name="date_type">ISSU</de>
<de name="date">20110703</de>
</ds>
<de name="92A">:INTR//1,95</de>
<de name="16S">FIA</de>
<de name="90A">:MRKT//PRCT/100,47</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<ds name="93B">
<de name="amount_type">AVAI</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<ds name="93B">
<de name="amount_type">NAVL</de>
<de name="unit_type">FAMT</de>
<de name="amount">0</de>
</ds>
<de name="16R">SUBBAL</de>
<ds name="93B">
<de name="amount_type">AGGR</de>
<de name="unit_type">FAMT</de>
<de name="amount">200</de>
</ds>
<de name="16S">SUBBAL</de>
<de name="19A">:HOLD//EUR1000,</de>
<de name="16S">FIN</de>
</catalog>
</businessevent>
如您所见,它是一个扁平的 XML,结构怪异,我只能使用 XSLT 1.0 来操作它。子结构重复启动
<de name="16R">FIN</de>
并以
结尾 <de name="16S">FIN</de>
对于这个重复结构中的每一个,我需要获取一些信息,并且只需要获取第一次出现的 93B 且 amount_type = AGGR。在第一个 "group" 它重复并给我带来问题。
预期结果:
<businessevent>
<catalog>
<ds>
<de name="instrument_identification">ISIN AT0000A0U3T4</de>
<de name="instrument_type">ISIN</de>
<de name="instrument_code">AT0000A0U3T4</de>
<de name="amount">100</de>
</ds>
</catalog>
</businessevent>
非常感谢!
根据您之前的问题,您仍然可以使用以下键来执行 "group-starting-with" 的形式:
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
要获得您想要的前三个元素,在“35B”中,您可以这样做...
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
并获得第一个“93B”元素,amount_type of "AGGR" 你可以这样做:
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
这样试试...
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="start" match="catalog/*" use="generate-id(preceding-sibling::de[@name='16R'][. = 'FIN'][1])" />
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:for-each select="de[@name='16R'][. = 'FIN']">
<group>
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='35B']]" mode="ds-35B" />
<xsl:apply-templates select="key('start', generate-id())[self::ds[@name='93B'][de[@name='amount_type']='AGGR']][1]" mode="ds-93B" />
</group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="ds" mode="ds-35B">
<xsl:apply-templates select="de[@name='instrument_identification' or @name='instrument_type' or @name='instrument_code']" />
</xsl:template>
<xsl:template match="ds" mode="ds-93B">
<xsl:apply-templates select="de[@name='amount']" />
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<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="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:apply-templates select="@* | node()"/>
</xsl:template>
<xsl:template match="businessevent">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalog">
<xsl:copy>
<xsl:apply-templates select="@*|de[@name='16R' and . = 'FIN']"/>
</xsl:copy>
</xsl:template>
<xsl:template match="de[@name='16R' and . = 'FIN']">
<xsl:apply-templates select="following-sibling::ds[@name='35B'][1]"/>
</xsl:template>
<xsl:template match="ds[@name='35B']">
<xsl:copy>
<xsl:copy-of select="de[@name='instrument_identification']"/>
<xsl:copy-of select="de[@name='instrument_type']"/>
<xsl:copy-of select="de[@name='instrument_code']"/>
<xsl:copy-of select="following-sibling::ds[de[@name='amount_type' and . = 'AGGR']][1]/de[@name='amount']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>