Xml 使用键控参数的XSLT转换

Xml 使用键控参数的XSLT转换,xml,xslt,Xml,Xslt,我有一个xslt文件,如下所示: <xsl:template match="Request"> <Instrument> <IdentifierType> <xsl:value-of select="IDContext"/> </IdentifierType> <Identifier> <xsl:

我有一个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>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
</Request>
<Instrument>
    <IdentifierType>ISIN</IdentifierType>
    <Identifier>XXX</Identifier>                            
    <Exchange>EX</Exchange>
</Instrument>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
    <Param Key='Exchange'>EX</Param>
</Request>

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

<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>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
</Request>
<Instrument>
    <IdentifierType>ISIN</IdentifierType>
    <Identifier>XXX</Identifier>                            
    <Exchange>EX</Exchange>
</Instrument>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
    <Param Key='Exchange'>EX</Param>
</Request>

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

<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>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
</Request>
<Instrument>
    <IdentifierType>ISIN</IdentifierType>
    <Identifier>XXX</Identifier>                            
    <Exchange>EX</Exchange>
</Instrument>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
    <Param Key='Exchange'>EX</Param>
</Request>

伊辛
XXX
前任

如何修改输入xml文件?谢谢大家!

XSLT当前正在寻找一个
Param
元素,该元素是正在匹配的当前
Request
元素的子元素。这意味着您希望您的XML如下所示:

<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>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
</Request>
<Instrument>
    <IdentifierType>ISIN</IdentifierType>
    <Identifier>XXX</Identifier>                            
    <Exchange>EX</Exchange>
</Instrument>
<Request>
    <Identifier>XXX</Identifier>
    <IDContext>ISIN</IDContext>
    <Param Key='Exchange'>EX</Param>
</Request>

XXX
伊辛
前任
话虽如此,这将生成以下输出:

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

伊辛
XXX
前任

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

在哪里检索
Param
信息?按照上面描述的方式编写,Param应该是
中的一个元素。。。您的样本输入真的代表了您的数据吗?@potame谢谢您的评论。我应该生成输入xml文件,这样我就可以自由地根据上面的xslt文件获得所需的输出。是的,我的示例输入正是我们当前提供给xslt文件的内容。当然,它是完整xml文件的一段代码。我可以将所需的数据(可能是
参数
ifnormalation)放在输入xml文件的任何位置(在
元素的内部或外部)。谢谢您的回答!
userdefinedindnetifier
对我来说不是问题,所以我没有提到它。因为我对xslt知之甚少,所以我认为
Param
Key
都是xslt中的关键词,而不是我定义的一些随机元素/属性。