Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我可以在XSLT中动态构建这个XPath查询吗?_Xml_Xslt_Xpath - Fatal编程技术网

Xml 我可以在XSLT中动态构建这个XPath查询吗?

Xml 我可以在XSLT中动态构建这个XPath查询吗?,xml,xslt,xpath,Xml,Xslt,Xpath,我有一个文件看起来像 <root> <element> <subelement1 /> <subelement2 /> </element> <element> <subelement2 /> <subelement1 /> </element> </root> 但不幸的是,这张表

我有一个文件看起来像

<root>
    <element>
        <subelement1 />
        <subelement2 />
    </element>
    <element>
        <subelement2 />
        <subelement1 />
    </element>
</root>

但不幸的是,这张表没有编译。我试图在XSLT中实现的是可能的吗?

*[name()=$nodename]
可能是您想要的,而不是
$nodename
,但是您最好用local-name()和namespace-uri()的值定义两个变量,并检查例如
*[local-name()=$localname和namespace-uri()=$namespaceuri]
以命名空间安全的方式选择元素。

不幸的是,构建xpath是不可能的。XPath是静态编译的;您不能动态生成它们(或者如果生成,它们只是字符串,无法执行)

但是,您可以编写一个查询,该查询碰巧交叉引用了几个本身是动态的值

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

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

  • 示例XML有一个文档元素
    ,但XPATH不包含

  • 这将使用上下文节点分配的变量返回前面的同级元素数:

    <xsl:variable name="nodename" select="name()" />
    <xsl:value-of select="count(/root/element[1]/*[name()=$nodename]/preceding-sibling::*)" />
    
    
    
    您可以消除该变量,只需使用:

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

    您的示例似乎不一致:在
    /element[2]/[someNode]
    的上下文中,您希望找到
    /element[1]/[someNode]
    ,例如
    /element[2]/subelement1
    中,您希望找到从
    /element[1]
    /element[1]/subelement2
    的距离,[someNode]也是如此此处为子元素2或子元素1?另请参见
    <xsl:value-of select="count(/root/element[1]/*[name()=name(current())]/preceding-sibling::*)" />