我在尝试使XPath匹配时出现此错误。
我做错了什么?
这是我的XML示例

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<ROOT>
  <DOCUMENT name="HLSSD">
    <TAG1 name="t1">
      text0
      <ELEM1 id="el1">
      text1
      </ELEM1>
      <MYELEMENT/>
      <ELEM2 id="el2">
      text2
        <ELEM2 id="el3">
        text3
        </ELEM2>
        <MYELEMENT/>
        <ELEM1 id="el4">
        text4
        </ELEM1>
        <MYELEMENT/>
        text4.5
        <ELEM1 id="el5">
        text5
        </ELEM1>
        <TAG3 name="t2"/>
        text5.6
        <ELEM2 id="el6">
        text6
        </ELEM2>
      </ELEM2>
      </TAG1>
    <TAG1 name="t3">
      <ELEM1 id="el7">
      text7
      </ELEM1>
      <ELEM2 id="el8">
        text3
        </ELEM2>
        <MYELEMENT/>
        <ELEM1 id="el9">
        text4
        </ELEM1>
        <MYELEMENT/>
        text4.5
        <ELEM1 id="el10">
        text5
        </ELEM1>
        <TAG3 name="t4"/>
        text5.6
        <ELEM2 id="el11">
        text6
      </ELEM2>
    </TAG1>
    <TAG2 name="t4">
    </TAG2>
    <TAG2 name="t5">
    </TAG2>
    <TAG1 name="t6">
    </TAG1>
  </DOCUMENT>
</ROOT>


这是我的XSL代码:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
 <html>
 <body><xsl:apply-templates/></body>
 </html>
 </xsl:template>
<xsl:template match="DOCUMENT">
  <div>
  <h1><xsl:value-of select="@name" /></h1>
  <xsl:apply-templates/>
  </div>
</xsl:template>
<xsl:template match="TAG1|TAG2|TAG3">
 <div>
  <h1><xsl:value-of select="name()" /></h1>
  <p><xsl:value-of select="@name" /></p>
  <pre><xsl:apply-templates/></pre>
  </div>
</xsl:template>
<xsl:template match="ELEM1|ELEM2">
    <p>(<xsl:apply-templates/>)</p>
</xsl:template>
<xsl:template match="MYELEMENT/following-sibling::*[count(.|(TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)=count((TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)]">
<div>
  <h1><xsl:value-of select="name()" /></h1>
  <p><xsl:apply-templates/></p>
</div>
</xsl:template>
</xsl:stylesheet>


我想要的是找到MYELEMENT及其后的所有内容,直到TAG1或TAG2或TAG3或MYELEMENT的第一个(一个)为止,或者具体来说,我想用div标签将MYELEMENT到TAG1或TAG2或TAG3的第一个元素中的每个元素包裹起来位于同一级别或父元素末尾的MYELEMENT。

输出应为:

<html>
<body>
<div>
 <h1>DocName</h1>
    <div>
     <h1>TAG1</h1>
     <p>t1</p>
     <pre>
      text0
      <p>(
      text1
      )</p>
      **<DIV>**
      **<H1>MYELEMENT</H1>**
      <p>(
      text2
        <p>(
        text3
        )</p>
        **<DIV>**
        **<H1>MYELEMENT</H1>**
        <p>(
        text4
        )</p>
        **</DIV>**
        **<DIV>**
        <H1>MYELEMENT</H1>
        text4.5
        <p>(
        text5
        )</p>
        **</DIV>**
        <div>
         <h1>TAG3</h1>
         <p>t2</p>
         <pre></pre>
        </div>
        text5.6
        <p>(
        text6
        )</p>
      )</p>
      **</DIV>**
      </pre>
    </div>
    <div>
     <h1>TAG1</h1>
     <p>t3</p>
     <pre>
      <p>(
      text7
      )</p>
      <p>(
        text3
        )</p>
        **<DIV>**
        **<H1>MYELEMENT</H1>**
        <p>(
        text4
        )</p>
        **</DIV>**
        **<DIV>**
        **<H1>MYELEMENT</H1>**
        text4.5
        <p>(
        text5
        )</p>
        **</DIV>**
        <div>
         <h1>TAG3</h1>
         <p>t4</p>
         <pre></pre>
        </div>
        text5.6
        <p>(
        text6
      )</p>
    </pre>
    </div>
    <div>
     <h1>TAG2</h1>
     <p>t5</p>
     <pre>
    </pre>
    </div>
    <div>
     <h1>TAG2</h1>
     <p>t6</p>
     <pre>
    </pre>
    </div>
    <div>
     <h1>TAG1</h1>
     <p>t7</p>
     <pre>
    </pre>
    </div>
</div>
</body>
</html>

最佳答案

您可以将match路径更改为具有相同语义的有效路径,如下所示:

<xsl:template match="*[preceding-sibling::MYELEMENT and
  count(.|(TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*) =
  count((TAG1|TAG2|TAG3|MYELEMENT)/preceding-sibling::*)]">

10-08 14:16