这是我的xml的摘录:
<node/>
<node/>
<node id="1">content</node>
<node/>
<node/>
<node/>
<node id="2">content</node>
<node/>
<node/>
Run Code Online (Sandbox Code Playgroud)
我定位于node[@id='1'].我需要一个Xpath来匹配所有<node/>元素,直到下一个非空节点(这里node[@id='2']).
编辑: @id属性只是为了更清楚地解释我的问题,但不是我原来的XML.我需要一个不使用@id属性的解决方案.
我不希望空的兄弟姐妹后匹配node[@id='2'],所以我不能用天真following-sibling::node[text()=''].
我怎样才能做到这一点?
似乎这个问题之前没有在stackoverflow上讨论过,除了使用嵌套的XPath Predicates ...精炼在哪里提供了不涉及嵌套谓词的解决方案.
所以我试着写出我想要得到的过度简化的样本:
输入:
<root>
<shortOfSupply>
<food animal="doggie"/>
<food animal="horse"/>
</shortOfSupply>
<animalsDictionary>
<cage name="A" animal="kittie"/>
<cage name="B" animal="dog"/>
<cage name="C" animal="cow"/>
<cage name="D" animal="zebra"/>
</animals>
</root>
Run Code Online (Sandbox Code Playgroud)
输出:
<root>
<hungryAnimals>
<cage name="B"/>
<cage name="D"/>
</hungryAnimals>
</root>
Run Code Online (Sandbox Code Playgroud)
或者,如果没有交叉点,
<root>
<everythingIsFine/>
</root>
Run Code Online (Sandbox Code Playgroud)
我想使用嵌套谓词来获取它:
<xsl:template match="cage">
<cage>
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
</cage>
</xsl:template>
<xsl:template match="/root/animalsDictionary">
<xsl:choose>
<!-- in <food> in <cage> -->
<xsl:when test="cage[/root/shortOfSupply/food[ext:isEqualAnimals(./@animal, ?????/@animal)]]">
<hungryAnimals>
<xsl:apply-templates select="cage[/root/shortOfSupply/food[ext:isEqualAnimals(@animal, ?????/@animal)]]"/>
</hungryAnimals>
</xsl:when>
<xsl:otherwise>
<everythingIsFine/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
那么我该?????怎么写呢呢?
我知道我可以使用一个更多的模板和变量/参数的广泛使用来重写整个样式表,但它甚至使这个样式表变得更加复杂,更不用说真实问题的真实样式表了. …
我已经在SO和其他地方看到以下内容应该可以工作(这个例子直接取自O'Reilly的XSLT Cookbook):
(: intersection :)
$set1[count(. | $set2) = count($set2)]
(: difference :)
$set1[count(. | $set2) != count($set2)]
Run Code Online (Sandbox Code Playgroud)
它看起来应该没问题,但是当与实际路径而不是变量一起使用时,这似乎失败了.例如,给出以下文档
<a>
<new>
<val>1</val>
<val>2</val>
</new>
<old>
<val>2</val>
<val>3</val>
</old>
</a>
Run Code Online (Sandbox Code Playgroud)
和XPath表达式/a/new/val[count(. | /a/old/val)=count(/a/old/val)]/text()我希望得到节点集,{ 2 }但我得到了{ 1 2 }.我有什么想法我做错了吗?