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 XPath-通过分析以下同级来选择节点_Xml_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

Xml XPath-通过分析以下同级来选择节点

Xml XPath-通过分析以下同级来选择节点,xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,我有以下XML文档 <doc> <h1>aa</h1> <p>bb</p> <p>cc</p> <h1>dd</h1> <p>ee</p> <h2>ff</h2> <h2>gg</h2> <h1>jj</h1> <

我有以下XML文档

<doc>
    <h1>aa</h1>
    <p>bb</p>
    <p>cc</p>

    <h1>dd</h1>
    <p>ee</p>
    <h2>ff</h2>
    <h2>gg</h2>

    <h1>jj</h1>
    <p>kk</p>
    <p>ll</p>

    <h1>hh</h1>
    <h2>ii</h2>
    <p>jj</p>
</doc>

aa
bb

抄送

dd ee

ff 游戏打得好 林俊杰 kk

ll

嗯 二, jj

我需要编写一个XPath查询来获取
节点,其中在出现另一个
节点之前存在以下同级
节点。在这种情况下,应选择第2个和第4个
节点。(
节点在另一个
节点之前存在于以下SIBLIG中)

我试着在几个小时内完成这项工作,但想不出任何合适的解决方案来获取这些节点


有人能提出一种方法来解决这个问题吗?

选择这样的h1节点,其中h2是h1和h2节点中的第一个后续兄弟节点

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/doc">
        <xsl:for-each select="h1[following-sibling::*[self::h1 or self::h2][1][self::h2]]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

选择这样的h1节点,其中h2是h1和h2节点中的第一个后续兄弟节点

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/doc">
        <xsl:for-each select="h1[following-sibling::*[self::h1 or self::h2][1][self::h2]]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

选择这样的h1节点,其中h2是h1和h2节点中的第一个后续兄弟节点

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/doc">
        <xsl:for-each select="h1[following-sibling::*[self::h1 or self::h2][1][self::h2]]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

选择这样的h1节点,其中h2是h1和h2节点中的第一个后续兄弟节点

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/doc">
        <xsl:for-each select="h1[following-sibling::*[self::h1 or self::h2][1][self::h2]]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

只需找到h2并取前面的h1

 //h2/preceding-sibling::h1[1]
结果

Element='<h1>dd</h1>'
Element='<h1>hh</h1>'
Element='dd'
元素='hh'

只需找到h2并取前面的h1

 //h2/preceding-sibling::h1[1]
结果

Element='<h1>dd</h1>'
Element='<h1>hh</h1>'
Element='dd'
元素='hh'

只需找到h2并取前面的h1

 //h2/preceding-sibling::h1[1]
结果

Element='<h1>dd</h1>'
Element='<h1>hh</h1>'
Element='dd'
元素='hh'

只需找到h2并取前面的h1

 //h2/preceding-sibling::h1[1]
结果

Element='<h1>dd</h1>'
Element='<h1>hh</h1>'
Element='dd'
元素='hh'

2和4节点-来自何处?示例中的节点是什么?@splash58,很抱歉弄错了。我已经更新了问题2和问题4节点-来自什么?示例中的节点是什么?@splash58,很抱歉弄错了。我已经更新了问题2和问题4节点-来自什么?示例中的节点是什么?@splash58,很抱歉弄错了。我已经更新了问题2和问题4节点-来自什么?示例中的节点是什么?@splash58,很抱歉弄错了。我已经更新了问题XPath是声明性的,即在大多数情况下,您可以轻松地将初始查询直接转换为XPath,只需很少的努力。XPath是声明性的,即在大多数情况下,您可以轻松地将初始查询直接转换为XPath,只需很少的努力。XPath是声明性的,也就是说,在大多数情况下,您可以轻松地将初始查询直接转换为XPath,只需很少的努力。XPath是声明性的,也就是说,在大多数情况下,您可以轻松地将初始查询直接转换为XPath,只需很少的努力。