首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写XPath查询以匹配基于属性和内容的元素

编写XPath查询以匹配基于属性和内容的元素
EN

Stack Overflow用户
提问于 2010-02-18 23:19:05
回答 2查看 1.6K关注 0票数 4

我有一些这样的XML:

代码语言:javascript
复制
<topics>
  <topic id="50"/>
  <topic id="51"/>
  <topic id="52"/>
</topics>

<discussions>
  <discussion type="foo">talked about T50 as Discussion 1000</discussion>
  <discussion type="bar">Food is yummy!</discussion>
  <discussion type="foo">talked about T52 as Discussion 1050</discussion>
</discussions>

给定特定的主题ID ($topicID),我想做以下工作:

  • 设计一个XPath表达式,如果存在包含文本T$topicID as Discussion <corresponding-discussion-id><discussion>type="foo",则该表达式为真。
  • 设计一个XPath表达式,在给定$topicID的情况下,它将提取文本Discussion <corresponding-discussion-id>

这个是可能的吗?

更新:

对于第一个,我想我需要这样的东西:

代码语言:javascript
复制
exists(
 //discussions/discussion[
  @type="foo" and
  contains(text(), concat($topicId, ??? ))  <-- What goes here? I think we need
 ]                                           some kind of matches(...) around the
)                                            concat(), too.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-18 23:29:13

下面的XPath将选择type=属性为“foo”,并包含文本"T50作为讨论“(当$topicid=50时)。

代码语言:javascript
复制
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]

给定一个特定的讨论元素,相应的id由以下方法提供:

代码语言:javascript
复制
substring-after(normalize-space(.),' as Discussion ')

我们可以通过替换“2”来组合2。在第二个表达式中与整个第一个表达式。请注意,如果多个讨论与内部表达式匹配,我们将从第二个开始将它们的值连接起来。

代码语言:javascript
复制
substring-after(normalize-space(
    //discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
),' as Discussion ')

如果有多个匹配的讨论,您可以这样处理它们:

代码语言:javascript
复制
<xsl:for-each select="//topics/topic">
    <xsl:variable name="topicid" select="@id" />
    <xsl:for-each select="//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]">
        <xsl:variable name="relatedid" select="substring-after(normalize-space(.),' as Discussion ')" />

        <!-- do something with $topicid and $relatedid -->

    </xsl:for-each>
</xsl:for-each>

功能参考资料:

  • 凹()
  • 包含()
  • 子字符串-后()

就我个人而言,如果没有Michael的书,我无法想象进行认真的XSLT开发。

票数 5
EN

Stack Overflow用户

发布于 2010-02-18 23:28:31

是否讨论过type=foo包含相应的topicID

代码语言:javascript
复制
/discussions/discussion[@type=foo AND contains(.,'T52')]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2292975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档