使用keyed Param进行XSLT转换

时间:2016-01-27 09:43:32

标签: xml xslt

我有一块xslt文件,如下所示:

<xsl:template match="Request">
    <Instrument>
        <IdentifierType>
                 <xsl:value-of select="IDContext"/>
        </IdentifierType>
        <Identifier>
                 <xsl:value-of select="Identifier"/>
        </Identifier>
        <UserDefinedIdentifier>
                 <xsl:value-of select="UserDefinedIdentifier"/>
        </UserDefinedIdentifier>
        <xsl:if test="Param[@Key='Exchange']">
                 <Exchange>
                           <xsl:value-of select="Param[@Key='Exchange']"/>
                 </Exchange>
        </xsl:if>
    </Instrument>
</xsl:template>

一个输入的xml片段如下所示:

<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
</Request>

现在我想稍微修改输入xml,以便输出如下:

<Instrument>
    <IdentifierType>ISIN</IdentifierType>
    <Identifier>XXX</Identifier>                            
    <Exchange>EX</Exchange>
</Instrument>

我应该如何修改输入的xml文件?谢谢!

1 个答案:

答案 0 :(得分:2)

XSLT当前正在寻找Param元素,该元素是正在匹配的当前Request元素的子元素。这意味着您希望您的XML看起来像这样:

<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
    <Param Key='Exchange'>EX</Param>
</Request>

话虽如此,这会产生以下输出:

<Instrument>
   <IdentifierType>ISIN</IdentifierType>
   <Identifier>XXX</Identifier>
   <UserDefinedIdentifier/>
   <Exchange>EX</Exchange>
</Instrument>

您显示的模板始终为UserDefinedIdentifier元素创建Request,无论XML中是否存在UserDefinedIdentifier元素。解决这个问题的唯一方法是将XSLT更改为处理不存在的XSLT。