我可以在XSLT中动态构建此XPath查询吗?

Mar*_*oms 6 xml xslt xpath

我有一个看起来像的文件

<root>
    <element>
        <subelement1 />
        <subelement2 />
    </element>
    <element>
        <subelement2 />
        <subelement1 />
    </element>
</root>
Run Code Online (Sandbox Code Playgroud)

在我的XSLT表中,/element[2]/[someNode]我希望得到一个代表距离的数字/element[1]/[someNode](即前面兄弟的数量/element1/[someNode]).例如,在的情况下/element[2]/subelement1,我想有一些办法让数字2,从远处/element[1]/element[1]/subelement2.我只需要第一个实例的给定节点名称的距离<element>.

我直觉地认为我可以构建它

 <xsl:variable name="nodename" select="name()" />
 <xsl:value-of select="/element[1]/$nodename/preceding-sibling::*" />
Run Code Online (Sandbox Code Playgroud)

但不幸的是这张表没有编译.我想在XSLT中实现什么?

Mad*_*sen 8

  1. 您不能将XSLT变量用作XPATH语句的轴,但可以在谓词过滤器中使用它.因此,如果要匹配任何元素(即*),然后将其限制为名称()等于存储在变量(即*[name()=$nodename])中的值的元素,则XPATH将有效.

  2. 您正在构建的XPATH将返回匹配元素的值.如果要返回与该模式匹配的元素数,可以使用该count()函数.

  3. 您的示例XML具有文档元素<root>,但您的XPATH不包含<root>.

这将使用上下文节点指定的变量返回previous-sibling元素的数量:

<xsl:variable name="nodename" select="name()" />
<xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" />
Run Code Online (Sandbox Code Playgroud)

你可以消除变量,只需使用:

<xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" />
Run Code Online (Sandbox Code Playgroud)