我有一些这样的 XML:

<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 表达式,如果 <discussion>type="foo" 包含文本 T$topicID as Discussion <corresponding-discussion-id> ,则该表达式为真。
  • 设计一个 XPath 表达式,给定 $topicID ,它将提取文本 Discussion <corresponding-discussion-id>

  • 这可能吗?

    更新:

    对于第一个,我想我需要这样的东西:
    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.
    

    最佳答案

    以下 XPath 将选择讨论属性 type="foo"并包含文本“T50 as Discussion”(当 $topicid=50 时)。

    //discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
    

    给定一个特定的讨论元素,相应的 id 由下式给出:
    substring-after(normalize-space(.),' as Discussion ')
    

    我们可以通过替换“.”来组合 2。在带有整个第一个表达式的第二个表达式中。请注意,如果多个讨论与内部表达式匹配,我们将从第二个中连接它们的值。
    substring-after(normalize-space(
        //discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
    ),' as Discussion ')
    

    如果有多个匹配的讨论,您可以这样处理它们:
    <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>
    

    函数引用:
  • concat()
  • contains()
  • substring-after()

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

    关于xslt - 编写 XPath 查询以根据属性和内容匹配元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2292975/

    10-12 12:48