如何在xsl模板之间传递参数

时间:2012-12-20 10:12:00

标签: xslt parameters

我有以下xsl文件,它通过元素“id”连接两个xml文件:

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

<xsl:key name="trans" match="Transaction" use="id" />

<!-- Identity template to copy everything we don't specifically override -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>

<!-- override for Mail elements -->
<xsl:template match="Mail">
<xsl:copy>
<!-- copy all children as normal -->
<xsl:apply-templates select="@*|node()" />
<xsl:variable name="myId" select="id" />
  <Transaction_data>
    <xsl:for-each select="document('transactions.xml')">
      <!-- process all transactions with the right ID -->
      <xsl:apply-templates select="key('trans', $myId)" />
    </xsl:for-each>
  </Transaction_data>
</xsl:copy>
</xsl:template>

<!-- omit the id element when copying a Transaction -->
<xsl:template match="Transaction/id" />
</xsl:stylesheet>

现在我希望id成为一个参数。我将从xml文件中获取参数:

<xsl:param name="usenode" select="*[name() = document('params.xml')/*/join_node]"/>
<xsl:key name="trans" match="Transaction" use="*[name() = document('params.xml')/*/join_node]" />

我可以在这些行之后立即打印该变量的值,但是,当我想使用它时,似乎变量的值消失了。如何使变量对整个文件可见?

编辑:

好的,我正在尝试更具体地提出这个问题。

所以我的目标是我想要使用“id”的use属性

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes" />
<xsl:param name="usenode" select="*[name() = document('params.xml')/*/join_node]"/>
<xsl:key name="trans" match="Transaction" use="*[name() = document('params.xml')/*/join_node]" />

<!-- Identity template to copy everything we don't specifically override -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>

<!-- override for Mail elements -->
<xsl:template match="Mail">
<xsl:copy>
<!-- copy all children as normal -->
<xsl:apply-templates select="@*|node()" />
<xsl:variable name="myId" select="$usenode" />
<Transaction_data>
<xsl:for-each select="document('transactions.xml')">
  <!-- process all transactions with the right ID -->
  <xsl:apply-templates select="key('trans', $myId)" />
</xsl:for-each>
</Transaction_data>
</xsl:copy>
</xsl:template>

<!-- omit the id element when copying a Transaction -->
<xsl:template match="Transaction/id" />
</xsl:stylesheet>

当我提到$ usenode时,它是不可见的。谁能帮我?

1 个答案:

答案 0 :(得分:0)

你还没有说过你把xsl:param放在哪里。如果它是xsl:stylesheet的子代,那么它在整个样式表中都是可见的。如果它是xsl:template的子代,那么它只在该模板中可见。帖子的标题(在模板之间传递参数)表明你需要一个模板参数(即xsl:param作为xsl:template的子代) - 但坦率地说,你根本没有明确表达你想要达到的目标,你尝试了什么,或者它是如何失败的。所以我正在低估这个问题。