我无法使前面(或前面的兄弟)和后面(或后面的兄弟)正常工作:
我有以下xml:
<doc xmlns:lxslt="http://xml.apache.org/xslt" xml:lang="it">
<articolo id="U50779749147XPB">
<testatina id="U50779749147xtG">
<ln>in breve</ln>
</testatina>
<breve id="U50779749147yAC">
<h1>melegnano</h1>
<h2>Si ribalta</h2>
<h2>con l’auto</h2>
<h2>alla rotonda</h2>
<p>
<span class="rettangolo">n</span>
Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando,
</p>
<p class="rimando">
segue a pagina
<span class="pagina">5</span>
</p>
<h1>castelnuovo</h1>
<h2>Protesta</h2>
<h2>delle mamme</h2>
<h2>per la scuola</h2>
<p>
<span class="rettangolo">n</span>
Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
</p>
<p class="rimando">
segue a pagina
<span class="pagina">8</span>
</p>
<h1>salerano</h1>
<h2>sull’incendio: </h2>
<h2>«non ci sono </h2>
<h2>misteri»</h2>
<p>
<span class="rettangolo">n</span>
Sete il guardo esclude. Ma sedendo e mirando, interminati spazi di
</p>
<p class="rimando">
segue a pagina
<span class="pagina">6</span>
</p>
</breve>
</articolo>
</doc>
我需要选择第二个和第三个h1之间的所有节点和内容: 所以基本上:
<h2>Protesta</h2>
<h2>delle mamme</h2>
<h2>per la scuola</h2>
<p>
<span class="rettangolo">n</span>
Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
</p>
<p class="rimando">
segue a pagina
<span class="pagina">8</span>
</p>
我尝试了一切,但是后续和前面的工作没有按预期工作:我试过了
<xsl:variable name="set" select="/doc/articolo/breve/h1[2]/following::node()[count(.|/doc/articolo/breve/h1[3]/preceding::node())=count(/doc/articolo/breve/h1[3]/preceding::node())]"/>
但结果只是第一个h2:“Protesta”,它跳过所有左边的h2和p
所以我试着检查运算符跟随和前面的单个结果但是只返回一些元素而不是我的节点之前或之后的所有内容: 例如:
<xsl:variable name="vtextPostM" select="following-sibling::doc/articolo/breve/h1[2]"/>
<xsl:variable name="vtextPreN" select="preceding-sibling::doc/articolo/breve/h1[3]"/>
返回没有元素,这个
<xsl:variable name="vtextPostM" select="/doc/articolo[1]/breve/h1[2]/following-sibling::node()"/>
<xsl:variable name="vtextPreN" select="/doc/articolo[1]/breve/h1[3]/preceding-sibling::node()"/>
这会返回一个部分错误的集合:下面打印出Protesta(而不是所有其他后续节点)并且在Melegnano之前打印(是h1 [1]但是中间的所有节点都是如此)。我做了很多其他测试,但没什么,你能帮助我吗?
答案 0 :(得分:2)
这再次成为XSLT2.0和<xsl:for-each-group>
无关紧要的事情之一,但由于看起来你正在使用XSLT1.0,这里有一个选项:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:lxslt="http://xml.apache.org/xslt">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="doc/articolo/breve"/>
</xsl:template>
<xsl:template match="breve">
<xsl:copy>
<xsl:apply-templates select="h1[2]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="h1">
<!--
Apply following siblings whose first preceding <h1> sibling is the <h1>
element currently being processed
-->
<xsl:apply-templates
select="following-sibling::*[not(self::h1)][preceding-sibling::h1[1]
[generate-id() = generate-id(current())]]"/>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<breve>
<h2>Protesta</h2>
<h2>delle mamme</h2>
<h2>per la scuola</h2>
<p><span class="rettangolo">n</span>
Sempre caro mi fu quest'ermo colle, e questa siepe, che da tanta
parte dell'ultimo orizzonte il guardo esclude. Ma sedendo e mirando
</p>
<p class="rimando">
segue a pagina
<span class="pagina">8</span>
</p>
</breve>