我有一个相当长的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'的内容。
我对此表示怀疑,但我没有发现任何相似之处,但我想我在这里试一试。它可能非常有用。
答案 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
(或者如果您认为它现在足够简洁,则直接使用它。)