用从文件中取出的字符串替换xpath的部分

时间:2013-12-02 15:58:58

标签: string xpath

我有一个相当长的xpath构造,在xsl样式表中出现了好几次。

当然,这可以在搜索中进行搜索并在编辑器中替换,但我想知道,如果有更好的解决方案。

我想把孔xpath构造放到extern文件中(让我们称之为file.xml)就像这样

<ROOT>
<xpath>main_file_root/part2/parts[@xml:id=$a_variable]/@ref</xpath>
</ROOT>

然后“重新循环”此字符串(通过doc('file.xml')/ ROOT / xpath)作为xpath表达式的一部分。

这可能吗?

是否有任何xpath魔法告诉处理器“这个字符串实际上是一个xpath构造,像任何其他xpath表达式一样处理它”? (因此,在这种情况下,xslt处理器实际上会采用'main_file_root / part2 / parts [@xml:id = $ a_variable] / @ ref'的内容。

我对此表示怀疑,但我没有发现任何相似之处,但我想我在这里试一试。它可能非常有用。

1 个答案:

答案 0 :(得分:0)

  

我有一个相当长的xpath构造,在xsl样式表中多次出现。

鉴于您指的是doc函数,我假设您正在使用XSLT 2.0处理器。在这种情况下,最简单的解决方案可能是在样式表中定义自定义函数

<xsl:function name="local:getref" as="attribute()">
  <xsl:param name="a_variable" />
  <xsl:sequence select="main_file_root/part2/parts[@xml:id=$a_variable]/@ref" />
</xsl:function>

(您需要在xmlns:local="urn:local-functions"代码中添加xsl:stylesheet之类的内容。

然后,您可以根据需要从其他表达式调用此函数

<xsl:value-of select="local:getref('someId')" />

或者在这种特定情况下定义密钥

可能更有效
<xsl:key name="partsById" match="main_file_root/part2/parts" use="@xml:id" />

然后在函数定义中使用key('partsById', 'someId')/@ref(或者如果您认为它现在足够简洁,则直接使用它。)