从输入xml中选择特定的列值

时间:2015-04-25 08:01:14

标签: xslt xslt-1.0

我有以下xml作为输入,我必须进行xsl转换

<emml>
    <tradeEventHeader>
        <tradeIdentifier>
            <tradeId>104823343913</tradeId>
            <systemReference>RDS</systemReference>
            <systemDomainName>Internal</systemDomainName>
        </tradeIdentifier>
        <tradeStateIdentifier>
            <tradeStateId>Validated</tradeStateId>
            <systemReference>RDS</systemReference>
            <tradeStateIdClassificationScheme>Vn State</tradeStateIdClassificationScheme>
        </tradeStateIdentifier>
        <tradeStateIdentifier>
            <tradeStateId>Pending</tradeStateId>
            <systemReference>Swapswire</systemReference>
            <tradeStateIdClassificationScheme>Mang State</tradeStateIdClassificationScheme>
        </tradeStateIdentifier>
        <tradeStateIdentifier>
            <tradeStateId>accpt_novated_sw</tradeStateId>
            <systemReference>RDS</systemReference>
            <tradeStateIdClassificationScheme>Clearing State</tradeStateIdClassificationScheme>
        </tradeStateIdentifier>
    </tradeEventHeader>
    <emmlExtension systemId="RDS YTO">
        <emmlMediumString idref="legId1" name="Roll Date Option">Short Initial</emmlMediumString>
    </emmlExtension>
</emml>

如上所示输入xml基本上我的目标是识别tradeStateIdClassificationScheme参数的值,如果此参数的值等于'清除状态'则对应于我必须检查另一列的值tradeStateId如果列tradeStateId的值以accpt_novated_sw开头,那么在这种情况下我们需要返回真正的字符串,而对于其他我需要返回false字符串..

我在xslt 1.0中提出了以下模板,请指教是正确的方法..

调用模板: -

<isClearedNovated>
            <xsl:call-template name="cleared_novated">
            <xsl:with-param name="tradeStateId" select="emml/*/*/tradeStateIdentifier" />
            </xsl:call-template>
            </isClearedNovated>


called template :-      



<xsl:template name="cleared_novated">
        <xsl:param name="tradeStateId" />

        <xsl:for-each select="$tradeStateId/tradeStateIdClassificationScheme">
            <xsl:choose>
            <xsl:when test="$tradeStateId[starts-with(tradeStateIdClassificationScheme,'accpt')] and systemReference='RDS'">
                <xsl:value-of select="'true'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'false'"/>
            </xsl:otherwise>
        </xsl:choose>
        </xsl:for-each>
  </xsl:template>

1 个答案:

答案 0 :(得分:1)

我真的不明白,你的需求究竟是什么,但你的XSLT可能不是你想要的 - 我怀疑它什么都不做......

所以也许我们可以从下面的建议开始,你可以说,有什么需要改进:

<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//tradeStateIdClassificationScheme"/>
  </xsl:template>

  <xsl:template match="tradeStateIdClassificationScheme[
                            . = 'Clearing State' and 
                            ../tradeStateId = 'accpt_novated_sw' and
                            ../systemReference = 'RDS'
                            ]">
    <xsl:value-of select="concat(.,': true&#x0a;')"/>
  </xsl:template>

  <xsl:template match="tradeStateIdClassificationScheme">
    <xsl:value-of select="concat(.,': false&#x0a;')"/>
  </xsl:template>


  <xsl:template match="@*|*"/>
</xsl:transform>

您会找到两个处理tradeStateIdClassificationScheme的模板,一个符合您的条件,另一个符合所有其他模板。

请注意,您没有撰写systemReference的内容,而您的试用模板会解决此问题。因此,我也加入了这个条件。

此版本的输出为:

Vn State: false
Mang State: false
Clearing State: true