2010-06-03 73 views
4

XPath可以获得节点的所有子节点的连接视图吗?我正在寻找类似于JQuery .html()方法的东西。如何连接XPath中节点的所有子节点的内容?

举例来说,如果我有下面的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> 

我想上一个XPath查询“H3 [@类=‘标题’]”这会给我“这是一些文本”。

这是一个真正的问题,但如果更多的上下文/背景有帮助,这里是:我正在使用XPath,并且我使用this post来帮助我编写一些复杂的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> 

我的输出XML考虑每个<h3>以及所有<p>标签,直到下一个<h3>。我写的XSL如下:

<xsl:template match="h3[@class='title']"> 
... 
    <xsl:apply-templates select="following-sibling::p[ 
     generate-id(preceding-sibling::h3[1][@class='title'][text()=current()/text()]) 
     = 
     generate-id(current()) 
    ]"/> 
... 
</xsl:template> 

的问题是,我使用text()方法来识别是相同的3H公司。在上面的例子中,“Title 2 is complex”标题的text()方法返回空白。我的想法是使用像JQuery的.html这样的方法,将返回我“标题2是复杂的”。

更新:这可能有助于澄清。转换之后,上述所需的输出会是这个样子:

<section> 
    <title>Title</title> 
    <p> 
     <content>Some</content> 
     <content> text</content> 
     <content> for</content> 
     <content> this</content> 
     <content> section</content> 
    </p> 
    <p> 
     <content>Another</content> 
     <content> paragraph</content> 
    </p> 
</section> 
<section> 
    <title> 
     <content>Title</content> 
     <content> 2</content> 
     <content> is</content> 
     <content> complex</content> 
    </title> 
    <p> 
     <content>Here</content> 
     <content> is</content> 
     <content> some</content> 
     <content> text</content> 
    </p> 
</section> 
+0

已添加完整样式表以响应添加完整的所需输出。 – 2010-06-09 13:43:38

+0

这是一个方便的工具(对于任何其他人有类似的任务)http://codebeautify.org/Xpath-Tester – Rimian 2015-09-18 11:21:46

回答

5
h3[@class='title']/span[@class='content']/text() 

喜欢这个?

h3[@class='title']/descendant::*/text() 

或者这个?

+0

是的,这似乎有帮助,但它扭转了我的问题。现在,它将拾取“标题2是复杂的”中的文本,但它不会拾取没有跨度的“标题”中的文本。 是否有XPath可以同时使用? 最糟糕的是,目前只有跨度,但实际上可能有任何标签。我真的希望有一个解决方案能够将文本从任何标签中提取出来。 – Brian 2010-06-04 14:17:02

+0

新的解决方案:这将拾取所有后代的内容(递归!) – nuqqsa 2010-06-04 14:25:11

+0

啊!看起来解决方法是使用//运算符代替跨度(它将从当前节点中选择符合选择的文档中的节点,而不管它们在哪里)的建议。这似乎工作。看起来好像我不能在注释中放入代码片段,但select子句的h3部分现在看起来像这样:h3 [1] [@ class ='title'] [// text()= current() //文本()])。 – Brian 2010-06-04 14:27:11

相关问题