【问题标题】:XSLT 1.0 loop elements after grouping分组后的 XSLT 1.0 循环元素
【发布时间】:2019-05-16 12:57:44
【问题描述】:

我需要您的帮助来解决 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。在第一个“组”中它会重复并给我带来问题。

预期结果:

    <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>

非常感谢!

【问题讨论】:

  • 您能否编辑您的问题以显示您期望的实际输出,因为获取信息是一回事,但实际使用它是另一回事。谢谢!
  • @TimC,请查看更新后的问题
  • 您是否也想更改输入 XML,因为提供的 XSLT 将不再适用于该结构? (您需要修改以使用“group-ending-with”方法)。谢谢
  • 是的,因为经过一些测试,我发现原始 XML 并不能解决我的真正问题。对不起,蒂姆:(
  • 蒂姆,请不要花时间尝试解决这个例子。我将用真正的问题编辑我的问题,以便您可以更好地帮助我。给我几分钟...

标签: xml xslt xslt-1.0 xslt-grouping


【解决方案1】:

根据您之前的问题,您仍然可以使用以下键执行“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”元素,使用“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>

【讨论】:

  • 像魅力一样工作!非常感谢!
【解决方案2】:
<?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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    相关资源
    最近更新 更多