我需要通过给定路径递归选择子项。 这是我的XML结构:
<items>
<item name="first">
<item name="fist-first">
[...]
</item>
<item name="first-second">
[...]
</item>
[...]
</item>
</items>
我需要通过xsl:param传递的路径选择特定项目(如“0-1”来选择第一个元素的第二个子元素)。我有一个字符串表示与其子位置有关的实际节点路径。
有人知道这是否可能并给我一些帮助?
我使用saxon 9.8he。
提前致谢
答案 0 :(得分:0)
使用Saxon 9.8和XSLT 3.0,您可以使用static parameter和路径表达式
<xsl:param name="path" static="yes" as="xs:string" select="'/items/item[1]/item[2]'"/>
如果您要使用该路径,则不会使用普通select
属性,而是使用相应的shadow attribute _select="{$path}"
,例如。
<xsl:template match="/">
<xsl:copy-of _select="{$path}"/>
</xsl:template>
然后,您可以像运行任何其他参数一样运行样式表时设置该参数。
答案 1 :(得分:0)
首先使用$path
函数将tokenize()
转换为正整数序列,例如(1,4,6),然后调用此递归函数:
<xsl:function name="f:by-path" as="element()?">
<xsl:param name="origin" as="element()*"/>
<xsl:param name="path" as="xs:integer*"/>
<xsl:sequence select="
if (empty($path))
then $origin
else $origin[head($path)]/f:by-path(*, tail($path))"/>
</xsl:function>