我在尝试使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::*)]">