xsl:如何在“match”中使用参数?
我的 xsl 有一个参数,
<xsl:param name="halfPath" select="'halfPath'"/>
我想在比赛中使用它,
<xsl:template match="Element[@at1='value1' and not(@at2='{$halfPath}/another/half/of/the/path')]"/>
但这不起作用。我猜a不能使用''里面的参数。如何解决/解决这个问题?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
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.:
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>
.那么,您可以在模板内使用条件指令:
您只需要知道该模板将处理满足第一个条件的所有元素。如果您有一个不同的模板来处理与第一个匹配但不与第二个匹配的元素,则使用
,并将另一个模板的正文放入
块。或者,如果您可以切换到 XSLT2 处理器,XSLT2 也可以按原样处理它。
Well, you could use a conditional instruction inside the 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.
这个主题回答了我的问题,但 Flynn1179 提出的解决方案对我来说不太正确(YMMV)。因此,请按照比我更专家的人建议的方式尝试一下,但如果它对您不起作用,请考虑我是如何解决的。我使用的 xsltproc 只处理 XSL 版本 1.0。
我需要匹配0024 < /代码>。我发现:
,但使用参数:
不起作用,尽管此处和其他地方声明这是 XSL v.1.0 所需的语法。相反,更简单的
完成了这项工作。另一点:上面 Dimitre 建议将模板放在 if 语句中。 xsltproc 对此抱怨:相反,我将 if 语句放在模板中:
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:
在 XSLT 2.0 中,您可以在匹配模式中引用全局变量,但语法比您的猜测更简单:
而不是
此外,语义也不是您所期望的:在“/”的 lhs 上引用的变量必须包含节点集,而不是 XPath 表达式的片段。
In XSLT 2.0 you can refer to global variables within a match pattern, but the syntax is simpler than your guess:
rather than
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.