使用XSLT遍历多个节点并按属性名称进行选择

时间:2014-05-13 20:25:17

标签: xslt-1.0

我在下面有以下XML格式,其主要重复节点是

    <portfolioSummary>...</portfolioSummary>

其中一个后代节点是

    <keys>
        <key>...</key>
        <key>...</key> 
    </keys>

如您所见,有多个<key>子节点。

我想设置一个XSLT模板,我选择<portfolioSummary>所有keys/key[displayValue='HSVaR']个节点。

我的XML输入样本集是:

<?xml version="1.0" encoding="UTF-8"?>
 <outBound>
    <body>
 <portfolioSummary portfolioId="61">
      <portfolio id="42">
       <currency>USD</currency>
        <keys>
           <key displayValue="My Company Inc" sequenceValue="My Company Inc" sequenceNumber="30" value="My Company Inc" />
           <key displayValue="COUNTERPARTY IRS" sequenceValue="COUNTERPARTY IRS" sequenceNumber="50" value="COUNTERPARTY IRS" />
           <key displayValue="Historical VaR" sequenceNumber="330" value="HSVaR" />               
        </keys>
      </portfolio>
      <exposureProfile>
          <node date="2008-08-08">
             <tag>HSVaR 5D 99.7 ES</tag>
             <exposure>16250079</exposure>
          </node>
      </exposureProfile>
      <summary>
       <util>33000000</util>
      </summary>
      </portfolio>
   </portfolioSummary>
  </body>
</outBound>

我想要的带样本的输出是(<extIA>..</extIA>可以重复多次):

  <?xml version="1.0" encoding="UTF-8"?>
  <collection  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <extIA>
    <legal_id>My Company Inc</legal_id>
    <AMOUNT>16250079</AMOUNT>
    <CURRENCY>USD</CURRENCY>
    <ValuationDate>2008-08-08</ValuationDate>
    <externalSystem>myExternalSystem123</externalSystem>
  </extIA>
  <extIA>
    <legal_id>My Company Inc</legal_id>
    <AMOUNT>100000</AMOUNT>
    <externalSystem>myExternalSystem123</externalSystem>
  </extIA>
   </collection>

我的XSLT入门代码如下(只是一些初学者的想法):

   <?xml version="1.0" encoding="UTF-8"?>
   <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"       
        version="1.0"
        indent="yes">
  <xsl:template match="/*">
     <collection>
        <xsl:apply-templates select="/outbound/body/portfolioSummary"/>
     </collection>
</xsl:template>
<!-- Pull portfolioSummary nodes -->
<xsl:template match="portfolio/keys/key[@value='HSVAR']">
    <xsl:apply-templates/>
</xsl:template>
  <xsl:template match="*">
    <extIA>
        <legal_id><xsl:value-of select="@portfolioId"></xsl:value-of></legal_id>
        <PRODUCT><xsl:value-of select="summary"/></PRODUCT>
        <AMOUNT><xsl:value-of select="exposureProfile"></xsl:value-of></AMOUNT>
        <CURRENCY>USD</CURRENCY>
        <ValuationDate>2012-05-15</ValuationDate>
        <externalSystem>My External System</externalSystem>
    </extIA>
  </xsl:template>
</xsl:stylesheet>

同样,我需要提取所有<portfolioSummary>个节点,但仅限于portfolio/keys/key[@value='HSVAR']

非常感谢您的建议。

1 个答案:

答案 0 :(得分:1)

我想在这里猜一想。给出以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<outBound>
    <body>
        <portfolioSummary portfolioId="42">
            <portfolio id="42">
                <currency>USD</currency>
                <keys>
                    <key displayValue="My Company Inc" sequenceValue="My Company Inc" sequenceNumber="30" value="My Company Inc" />
                    <key displayValue="COUNTERPARTY IRS" sequenceValue="COUNTERPARTY IRS" sequenceNumber="50" value="COUNTERPARTY IRS" />
                    <key displayValue="Historical VaR" sequenceNumber="330" value="HSVaR" />               
                </keys>
            <exposureProfile>
                <node date="2008-08-08">100000</node>
            </exposureProfile>
            <summary>
                <util>33000000</util>
            </summary>
            </portfolio>
        </portfolioSummary>
    </body>
</outBound>

和以下样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <collection>
            <xsl:apply-templates select="/outBound/body/portfolioSummary[descendant::key/@value[.='HSVaR']]"/>
        </collection>
    </xsl:template>

    <xsl:template match="portfolioSummary">
        <extIA>
            <legal_id><xsl:value-of select="@portfolioId"/></legal_id>
            <PRODUCT><xsl:value-of select="descendant::summary/util"/></PRODUCT>
            <AMOUNT><xsl:value-of select="descendant::exposureProfile/node"/></AMOUNT>
            <CURRENCY><xsl:value-of select="descendant::currency"/></CURRENCY>
            <ValuationDate><xsl:value-of select="descendant::exposureProfile/node/@date"/></ValuationDate>
            <externalSystem>RAZOR</externalSystem>
        </extIA>
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>
<collection>
    <extIA>
        <legal_id>42</legal_id>
        <PRODUCT>33000000</PRODUCT>
        <AMOUNT>100000</AMOUNT>
        <CURRENCY>USD</CURRENCY>
        <ValuationDate>2008-08-08</ValuationDate>
        <externalSystem>RAZOR</externalSystem>
    </extIA>
</collection>