如何将两个相关参数发送到模板

时间:2016-04-26 09:23:22

标签: xml xslt xpath

我正在尝试执行xslt模板,我需要两个相关参数。 xml的主要思想是一个包含客户端和银行的列表,类似这样的

<client>
    <id>lkjhg09876</q1:id>
    <name> name-value </name>
    <address> director-value </address>
    <bank-id> qwerty12345 <bank-id>
</client>

<bank>
    <id> qwerty12345 </id>
    <name> bank-name-value </name>
</bank>

所以我想要的是调用模板来处理所有客户端,我这样做

<xsl:call-template name="process-clients">
     <xsl:with-param name="client"
                     select="./client"/>
</xsl:call-template>

但是为了显示银行名称,我需要与我的客户相关的银行节点,而我在模板“process-clients”中没有该银行。

如何在模板中获取银行名称,或者如何将银行名称作为参数发送到模板?

2 个答案:

答案 0 :(得分:0)

您可以设置密钥以bank

获取id节点
<xsl:key name="banks" match="bank" use="id" />

然后,在process-clients模板中,您可以通过key('banks', $client/bank-id)访问银行节点。例如,要显示银行名称,它将如下所示:

<xsl:value-of select="key('banks', $client/bank-id)/name" />

如果你确实想要将银行节点作为参数传递,你可以这样做......

<xsl:call-template name="process-clients">
    <xsl:with-param name="client" select="client"/>
    <xsl:with-param name="bank" select="key('banks', client/bank-id)"/>
</xsl:call-template>

答案 1 :(得分:0)

如果我猜错了,你首先要处理银行,然后在每个银行中处理你想要处理银行客户的行。

如果是这样,您应该执行以下操作:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="client-by-bank" match="client" use="bank-id" />

<xsl:template match="/root">
    <root-wrapper>
        <xsl:apply-templates select="bank"/>
    </root-wrapper>
</xsl:template>

<xsl:template match="bank">
    <bank-wrapper>
        <!-- some bank details here -->
        <xsl:apply-templates select="key('client-by-bank', id)">
            <xsl:with-param name="bank-name" select="name"/>
        </xsl:apply-templates>
    </bank-wrapper>
</xsl:template>

<xsl:template match="client">
    <xsl:param name="bank-name" />
    <client-wrapper>
        <!-- client details here -->
        <!-- example of using bank name: -->
        <xsl:value-of select="$bank-name"/>
    </client-wrapper>
</xsl:template>

</xsl:stylesheet>