【发布时间】:2017-01-14 23:45:46
【问题描述】:
我想做
<xsl:variable name="myPattern" select="node1|node2"/>
<xsl:template match="$myPattern">
...
</xsl:template>
<xsl:template match="/">
...
<xsl:for-each select="distinct-values(//$myPattern/name/text()">
...
</xsl:for-each>
</xsl:template>
我在 XSLT 版本 2.0 和 3.0 上尝试过,但无济于事。有什么提示吗?
原因:模式有点复杂,我想在多个地方使用它,而不仅仅是这个匹配。
编辑:
我现在通过接受变量不包含字符串/模式,但包含结果节点的事实解决了我的问题。如果我将其修改为
<xsl:variable name="myNodes" select="//(node1|node2)"/>
<xsl:template match="$myNodes">
...
</xsl:template>
<xsl:template match="/">
...
<xsl:for-each select="distinct-values($myNodes/name/text()">
...
</xsl:for-each>
</xsl:template>
效果很好。
我仍然想知道为什么不能简单地将字符串存储在变量中并在允许文字字符串的任何地方使用它。
【问题讨论】:
-
XSLT 3.0 允许您使用例如
match="$xyz"并解释“$xyz 匹配变量 $xyz 的值中存在的任何节点”。因此,您需要向我们展示一个最小但完整的 XML、XSLT 示例、您期望的输出、您获得的输出或错误,以及有关使用的 XSLT 处理器的信息,以便我们判断哪里出了问题。显然,我希望您的变量声明看起来像例如<xsl:variable name="//node1 | //node2"/>,除非您要查找的元素确实是根元素。 -
@MartinHonnen:你是对的。我想让其他人的问题简短,以便在寻找答案时节省时间。我认为您的评论甚至比您的答案更好,因为这是我为解决它所做的:
<xsl:variable name="myNodes" select="//(node1|node2)"/>. -
@mdr 你必须使用某种
evaluate()函数来将字符串转换为XPath 表达式(如果这就是你的意思)。 -
@michael.hor257k:我想,这就是我要找的。你能告诉我怎么做吗?
-
@mdr,请参阅我的答案的编辑,如果您想要文本替换使用阴影属性。
标签: xml xslt xslt-2.0 xslt-3.0