在 xslt 中将局部变量从一个模板传递到另一个模板



我需要将一个模板中定义的局部变量的值传递给另一个模板 模板。

以下源不起作用(即我无法将局部变量传递给另一个模板(。怎么了?提前非常感谢。

`        <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="A/B/C">
</xsl:apply-templates>
<xsl:apply-templates select="A/B/D/E/F">
<xsl:with-param name="XYZ" select="$XYZ" >
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="A/B/C">
<xsl:variable name="XYZ">
<xsl:value-of select="K/L/M/N/O"/>
</xsl:variable>
</xsl:template>
<xsl:template match="A/B/D/E/F">
<xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
<xsl:value-of select="$XYZ" />
<xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
</xsl:template>
</xsl:stylesheet>`

您需要声明参数,并在匹配模板中使用xsl:param

<xsl:template match="A/B/D/E/F">
<xsl:param name="XYZ" />
<xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
<xsl:value-of select="$XYZ" />
<xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
</xsl:template>

但是,选择此模板的代码块存在问题

<xsl:apply-templates select="A/B/D/E/F">
<xsl:with-param name="XYZ" select="$XYZ" >
</xsl:with-param>

xsl:with-param正在选择要作为参数传递的变量名称XYZ,但模板中不存在此变量。也许您希望它使用与"A/B/C"匹配的模板中定义的变量?这不会发生,因为变量在声明它们的块的范围内是局部的。

也许您需要像这样编写 XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:variable name="XYZ">
<xsl:apply-templates select="A/B/C" />
</xsl:variable>
<xsl:apply-templates select="A/B/D/E/F">
<xsl:with-param name="XYZ" select="$XYZ" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="A/B/C">
<xsl:value-of select="K/L/M/N/O"/>
</xsl:template>
<xsl:template match="A/B/D/E/F">
<xsl:param name="XYZ" />
<xsl:text>BLAH-BLAH-BLAH-111</xsl:text>
<xsl:value-of select="$XYZ" />
<xsl:text>BLAH-BLAH-BLAH-999</xsl:text>
</xsl:template>
</xsl:stylesheet>

当您将其应用于此 XML 时

<A>
<B>
<C>
<K>
<L>
<M>
<N>
<O> *** Parameter *** </O>
</N>
</M>
</L>
</K>
</C>
<D>
<E>
<F>Test</F>
</E>
</D>
</B>
</A>

以下是输出

BLAH-BLAH-BLAH-111 *** Parameter *** BLAH-BLAH-BLAH-999

你的非工作代码似乎做了什么:

  • A 呼叫 B
  • B 设置局部变量$XYZ
  • A 调用 C
  • 您希望 C 能够访问$XYZ

问题不在于将参数从 A 传递到 C:这很容易。问题是将 $XYZ 的值从 B 返回给其调用方 A。

执行此操作的方式取决于您使用的 XSLT 版本。

  • 在 XSLT 1.0 中,唯一可以从模板返回的是 XML 块。模板 B 需要将它想要返回的所有内容包装在一个 XML 片段中,模板 A 需要在变量中捕获该 XML 片段。为了有用,它需要exslt:node-set((扩展将XML片段转换为节点集,从中提取所需的部分。

  • 在 XSLT 2.0 中,另一个选项是从模板返回一系列事物(例如.XML节点(:例如,调用方可以将该序列中的第一项复制到转换结果中,并将序列中的第二项传递给另一个模板进行进一步处理。

  • 在 XSLT 3.0 中,可以使用映射而不是序列,以便按名称而不是位置标识结果中的不同内容。

所有这些都是非常枯燥和学术的。如果您实际上告诉我们您的转换试图做什么(输入是什么,输出是什么,以及它们之间的关系如何?(,我们可以给你一个更好的答案。也许所有这些关于传递参数的东西意味着你以错误的方式完成工作,你最好使用完全不同的方法。

相关内容

  • 没有找到相关文章

最新更新