我正在尝试编写XSLT,它将在选定的后续兄弟节点上运行for-each,但在到达另一个标签(h1)时停止.
这是源XML:
<?xml version="1.0"?>
<html>
<h1>Test</h1>
<p>Test: p 1</p>
<p>Test: p 2</p>
<h1>Test 2</h1>
<p>Test2: p 1</p>
<p>Test2: p 2</p>
<p>Test2: p 3</p>
</html>
Run Code Online (Sandbox Code Playgroud)
这是XSLT:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<content>
<xsl:apply-templates/>
</content>
</xsl:template>
<xsl:template match="h1">
<section>
<sectionHeading>
<xsl:apply-templates/>
</sectionHeading>
<sectionContent>
<xsl:for-each select="following-sibling::p">
<paragraph>
<xsl:value-of select="."/>
</paragraph>
</xsl:for-each>
</sectionContent>
</section>
</xsl:template>
<xsl:template match="p"/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
这是当前的结果:
<?xml version="1.0" encoding="UTF-8"?>
<content>
<section>
<sectionHeading>Test</sectionHeading>
<sectionContent>
<paragraph>Test: p 1</paragraph>
<paragraph>Test: p 2</paragraph>
<paragraph>Test: p 3</paragraph>
<paragraph>Test2: p 1</paragraph>
<paragraph>Test2: …
Run Code Online (Sandbox Code Playgroud) 对于下面的示例HTML,返回带有class ='B'的class ='A'的"a"元素的兄弟的XPath查询可以写成://a[@class='A']/following-sibling::a[@class='B']
.此查询输出4个<a class="B"/>
元素.
但是,我只想要<a class="B"/>
跟随当前<a class="A"/>
元素的元素,而不想跟随其他<a class="B"/>
元素/节点的元素.换句话说,我只想要下面的<a class="B"/>
兄弟元素,直到下一个<a class="B"/>
元素出现.
示例HTML:
<a class='A' />
<a class='B' />
<a class='A' />
<a class='B' />
<a class='B' />
<a class='B' />
Run Code Online (Sandbox Code Playgroud)
关于如何将我当前的XPath查询限制为仅仅是那些兄弟姐妹的任何想法将非常感谢:)
我有以下html代码段:
<table>
<tr>
<td class="foo">a</td>
<td class="bar">1</td>
<td class="bar">2</td>
<td class="foo">b</td>
<td class="bar">3</td>
<td class="bar">4</td>
<td class="bar">5</td>
<td class="foo">c</td>
<td class="bar">6</td>
<td class="bar">7</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个XPath 1.0表达式,它从一个.foo
元素开始,并.bar
在下一个元素之前选择所有后续.foo
元素.
例如:我开始a
并且只想选择1
和2
.
或者我开始b
并想要选择3
,4
和5
.
背景:我必须为此方法找到一个XPath表达式(使用Java和Selenium):
public List<WebElement> bar(WebElement foo) {
return foo.findElements(By.xpath("./following-sibling::td[@class='bar']..."));
}
Run Code Online (Sandbox Code Playgroud)
有办法解决问题吗?
表达式应该适用于所有.foo
元素,而不使用任何外部变量.
谢谢你的帮助!
更新:这些特殊情况显然没有解决方案.但是如果您的限制较少,则提供的表达式可以完美地运行.
是否可以使用XPath获取节点的所有子节点的连接视图?我正在寻找类似JQuery .html()方法的东西.
例如,如果我有以下XML:
<h3 class="title">
<span class="content">this</span>
<span class="content"> is</span>
<span class="content"> some</span>
<span class="content"> text</span>
</h3>
Run Code Online (Sandbox Code Playgroud)
我想对"h3 [@ class ='title']"进行XPath查询,这会给我"这是一些文字".
这是真正的问题,但如果更多的上下文/背景是有用的,这里是:我使用XPath,我使用这篇文章来帮助我编写一些复杂的XSL.我的源XML看起来像这样.
<h3 class="title">Title</h3>
<p>
<span class="content">Some</span>
<span class="content"> text</span>
<span class="content"> for</span>
<span class="content"> this</span>
<span class="content"> section</span>
</p>
<p>
<span class="content">Another</span>
<span class="content"> paragraph</span>
</p>
<h3 class="title">
<span class="content">Title</span>
<span class="content"> 2</span>
<span class="content"> is</span>
<span class="content"> complex</span>
</h3>
<p>
<span class="content">Here</span>
<span class="content"> is</span>
<span class="content"> some</span>
<span class="content"> text</span>
</p>
Run Code Online (Sandbox Code Playgroud)
我的输出XML会考虑每个标记<h3>
以及所有<p> …
鉴于此XML/HTML:
<dl>
<dt>Label1</dt><dd>Value1</dd>
<dt>Label2</dt><dd>Value2</dd>
<dt>Label3</dt><dd>Value3a</dd><dd>Value3b</dd>
<dt>Label4</dt><dd>Value4</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)
我想找到所有<dt>
,然后,每个,找到以下<dd>
直到下一个<dt>
.
使用Ruby的Nokogiri我能够像这样完成:
dl.xpath('dt').each do |dt|
ct = dt.xpath('count(following-sibling::dt)')
dds = dt.xpath("following-sibling::dd[count(following-sibling::dt)=#{ct}]")
puts "#{dt.text}: #{dds.map(&:text).join(', ')}"
end
#=> Label1: Value1
#=> Label2: Value2
#=> Label3: Value3a, Value3b
#=> Label4: Value4
Run Code Online (Sandbox Code Playgroud)
但是,正如您所看到的,我在Ruby中创建一个变量,然后使用它编写一个XPath.我怎样才能编写一个相同的XPath表达式?
我猜到:
following-sibling::dd[count(following-sibling::dt)=count(self/following-sibling::dt)]
Run Code Online (Sandbox Code Playgroud)
但显然我不明白那self
是什么意思.
这个问题与XPath类似:选择所有以下兄弟,直到另一个兄弟,除了'stop'节点没有唯一标识符.
这个问题与xpath几乎相同,除了我要求的XPath专用解决方案之外,找到所有以下兄弟相邻节点直到另一个类型.
我是这个XSLT的新手,我无法弄清楚如何:
这是xml的片段,我从以下开始:
<Article>
<Bullettext>10,00 </Bullettext>
<Bullettext>8,00 </Bullettext>
</Article>
<Article>
<something>some text</something>
</Article>
<Article>
<Corpsdetexte>Bulgaria</Corpsdetexte>
<Bullettext>15,0 </Bullettext>
<Bullettext>10,0 </Bullettext>
</Article> `
Run Code Online (Sandbox Code Playgroud)
这就是我想要的输出:
<LIST>
<ITEM>12,00 </ITEM>
<ITEM>10,00 </ITEM>
<ITEM>8,00 </ITEM>
</LIST>
<P>
<something>some text</something>
</P>
<P>
<Corpsdetexte>Bulgaria</Corpsdetexte>
</P>
<LIST>
<ITEM>15,0 </ITEM>
<ITEM>10,0 </ITEM>
</LIST>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗??