通过不同的 XPath 从 XML 中检索属性值



我有以下xml,它给了我,我正在我的XSLT中传递它以进行转换。

<Report xmlns:fpml="http://www.fpml.org/FpML-5/confirmation" 
    xmlns="http://www.eurexchange.com/EurexIRSFullInventoryReport" 
    name="CB202 Full Inventory Report">
    <reportNameGrp>
        <CM>
            <acctTypGrp name="A4">
                <ProductType name="Swap">
                    <currTypCod value="EUR">
                        <rateIndex name="EURIBOR">
                            <rateIndexTenor name="6M">
                                <idxSource>EURIBOR01</idxSource>
                            </rateIndexTenor>
                        </rateIndex>
                    </currTypCod>
                    <currTypCod value="GBP">
                        <rateIndex name="LIBOR">
                            <rateIndexTenor name="1Y">
                                <idxSource>LIBOR01</idxSource>
                            </rateIndexTenor>
                        </rateIndex>
                    </currTypCod>
                </ProductType>
            </acctTypGrp>
        </CM>
    </reportNameGrp>
</Report>

我为此开发了以下 XSLT,稍后也将将其用于转换目的。在下面的 XSLT 中,我尝试从上面的 XML 中检索值:

<xsl:stylesheet version="1.0" xmlns:fpml="http://www.fpml.org/FpML-5/confirmation" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:eur="http://www.eurexchange.com/EurexIRSFullInventoryReport">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes" />
    <xsl:template match="/eur:Report">
        <Eurexflows>
            <xsl:apply-templates select="eur:reportNameGrp/eur:CM/eur:acctTypGrp/eur:ProductType/eur:currTypCod/eur:rateIndex/eur:rateIndexTenor" />
        </Eurexflows>
    </xsl:template>
    <xsl:template match="eur:rateIndexTenor">
        <EurexMessageObject>
            <CCPTradeId><xsl:value-of select="eur:CCPTradeId/@id" /></CCPTradeId>
            <novDateTime><xsl:value-of select="eur:CCPTradeId/eur:novDateTime" /></novDateTime>
            <feename><xsl:value-of select="eur:CCPTradeId/eur:feeType/@name"/></feename>
            <feePayAmnt><xsl:value-of select="eur:CCPTradeId/eur:feeType/eur:feePayAmnt"/></feePayAmnt>
            <feeCurrTypCod><xsl:value-of select="eur:CCPTradeId/eur:feeType/eur:feeCurrTypCod"/></feeCurrTypCod>
            <feeDate><xsl:value-of select="eur:CCPTradeId/eur:feeType/eur:feeDate"/></feeDate>
            <idxSource><xsl:value-of select="eur:idxSource"/></idxSource>
            <rateIndexTenorname><xsl:value-of select="@name"/></rateIndexTenorname>
            <rateIndexname>
                <!--<xsl:value-of select="eur:report/eur:reportNameGrp/eur:CM/eur:acctTypGrp/@name/eur:ProductType/@name"/>-->
                <xsl:for-each select="eur:report/eur:reportNameGrp/eur:CM/eur:acctTypGrp/eur:ProductType/eur:currTypCod">
                    <xsl:value-of select="eur:rateIndex/@name" />
                </xsl:for-each>
            </rateIndexname>
        </EurexMessageObject>
    </xsl:template>
</xsl:stylesheet>

现在如您所见,在上面的 XSL 中,我想检索属性<rateIndex name>的值,这并不理想。<rateIndexname>的值应该是EURIBORLIBOR

请告知我如何检索rateIndex元素上的name属性的值。请解释一下我的 XSLT 中应用的 XPath 出了什么问题。

在模板中,您当前位于rateIndexTenor元素上。您希望获得其名称的rateIndex是此名称的父级。因此,您可以使用此表达式来替换此处不必要的xsl:for-each,因为只有一个父项:

<xsl:value-of select="parent::eur:rateIndex/@name"/>

这可以简化为这样,其中..是父节点的简写。

<xsl:value-of select="../@name"/>

相关内容

  • 没有找到相关文章

最新更新