我有以下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>
的值应该是EURIBOR
,LIBOR
。
请告知我如何检索rateIndex
元素上的name
属性的值。请解释一下我的 XSLT 中应用的 XPath 出了什么问题。
在模板中,您当前位于rateIndexTenor
元素上。您希望获得其名称的rateIndex
是此名称的父级。因此,您可以使用此表达式来替换此处不必要的xsl:for-each
,因为只有一个父项:
<xsl:value-of select="parent::eur:rateIndex/@name"/>
这可以简化为这样,其中..
是父节点的简写。
<xsl:value-of select="../@name"/>