xsl:如何在“match”中使用参数?

发布于 2024-11-09 23:11:01 字数 295 浏览 0 评论 0 原文

我的 xsl 有一个参数,

<xsl:param name="halfPath" select="'halfPath'"/>

我想在比赛中使用它,

<xsl:template match="Element[@at1='value1' and not(@at2='{$halfPath}/another/half/of/the/path')]"/>

但这不起作用。我猜a不能使用''里面的参数。如何解决/解决这个问题?

My xsl has a parameter

<xsl:param name="halfPath" select="'halfPath'"/>

I want to use it inside match

<xsl:template match="Element[@at1='value1' and not(@at2='{$halfPath}/another/half/of/the/path')]"/>

But this doesn't work. I guess a can not use parameters inside ''. How to fix/workaround that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

何以畏孤独 2024-11-16 23:11:01

XSLT 1.0 W3C 规范禁止引用变量/匹配模式内的参数

“这是一个错误的值
匹配属性以包含
变量引用”

XSLT 2.0 中没有此类限制,因此请使用 XSLT 2.0

如果由于无法克服的原因而无法使用 XSLT2.0,请放置 内的 template> 指令,其中与匹配模式结合的测试等效于包含变量/参数引用的 XSLT 2.0 匹配模式。

在更复杂的情况下,您有多个模板匹配同一类型的节点,但具有引用变量/参数的不同谓词,则需要使用包装 包装

The XSLT 1.0 W3C Specification forbids referencing variables/parameters inside a match pattern.:

"It is an error for the value of the
match attribute to contain a
VariableReference"

There is no such limitation in XSLT 2.0, so use XSLT 2.0.

If due to unsurmountable reasons using XSLT2.0 isn't possible, put the complete body of the <xsl:template> instruction inside an <xsl:if> where the test in conjunction with the match pattern is equivalent to the XSLT 2.0 match pattern that contains the variable/parameter reference(s).

In a more complicated case where you have more than one template matching the same kind of node but with different predicates that reference variables/parameters, then a wrapping <xsl:choose> will need to be used instead of a wrapping <xsl:if>.

爱,才寂寞 2024-11-16 23:11:01

那么,您可以在模板内使用条件指令:

<xsl:template match="Element[@at1='value1']">
  <xsl:if test="not(@at2=concat($halfPath,'/another/half/of/the/path'))">
    .. do something
  </xsl:if>
</xsl:template>

您只需要知道该模板将处理满足第一个条件的所有元素。如果您有一个不同的模板来处理与第一个匹配但不与第二个匹配的元素,则使用 ,并将另一个模板的正文放入 块。

或者,如果您可以切换到 XSLT2 处理器,XSLT2 也可以按原样处理它。

Well, you could use a conditional instruction inside the template:

<xsl:template match="Element[@at1='value1']">
  <xsl:if test="not(@at2=concat($halfPath,'/another/half/of/the/path'))">
    .. do something
  </xsl:if>
</xsl:template>

You just need to be aware that this template will handle all elements that satisfy the first condition. If you have a different template that handles elements that match the first, but not the second, then use an <xsl:choose>, and put the other template's body in the <xsl:otherwise> block.

Or, XSLT2 can handle it as is if you can switch to an XSLT2 processor.

脱离于你 2024-11-16 23:11:01

这个主题回答了我的问题,但 Flynn1179 提出的解决方案对我来说不太正确(YMMV)。因此,请按照比我更专家的人建议的方式尝试一下,但如果它对您不起作用,请考虑我是如何解决的。我使用的 xsltproc 只处理 XSL 版本 1.0。

我需要匹配 ,但使用参数:0024< /代码>。我发现:
不起作用,尽管此处和其他地方声明这是 XSL v.1.0 所需的语法。
相反,更简单的 完成了这项工作。

另一点:上面 Dimitre 建议将模板放在 if 语句中。 xsltproc 对此抱怨:相反,我将 if 语句放在模板中:

<xsl:template match="leadTime">
  <xsl:if test="@hour=$leadhour">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:if>
</xsl:template>

This topic had the answer to my question, but the proposed solution by Flynn1179 was not quite correct for me (YMMV). So try it the way it is suggested by people more expert than me, but if it doesn't work for you, consider how I solved it. I am using xsltproc that only handles XSL version 1.0.

I needed to match <leadTime hour="0024">, but use a param: <xsl:param name="hour">0024</xsl:param>. I found that:
<xsl:if test="@hour='{$hour}'"> did not work, despite statements here and elsewhere that this is the required syntax for XSL v.1.0.
Instead, the simpler <xsl:if test="@hour=$hour"> did the job.

One other point: it is suggested above by Dimitre that you put template inside if statement. xsltproc complained about this: instead I put the if statement inside the template:

<xsl:template match="leadTime">
  <xsl:if test="@hour=$leadhour">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
  </xsl:if>
</xsl:template>
南街九尾狐 2024-11-16 23:11:01

在 XSLT 2.0 中,您可以在匹配模式中引用全局变量,但语法比您的猜测更简单:

<xsl:template match="Element[@at1='value1' and 
              not(@at2=$halfPath/another/half/of/the/path)]"/>

而不是

<xsl:template match="Element[@at1='value1' and 
              not(@at2='{$halfPath}/another/half/of/the/path')]"/>

此外,语义也不是您所期望的:在“/”的 lhs 上引用的变量必须包含节点集,而不是 XPath 表达式的片段。

In XSLT 2.0 you can refer to global variables within a match pattern, but the syntax is simpler than your guess:

<xsl:template match="Element[@at1='value1' and 
              not(@at2=$halfPath/another/half/of/the/path)]"/>

rather than

<xsl:template match="Element[@at1='value1' and 
              not(@at2='{$halfPath}/another/half/of/the/path')]"/>

Also, the semantics are not what you appear to be expecting: a variable referenced on the lhs of "/" must contain a node-set, not a fragment of an XPath expression.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文