English 中文(简体)
撰写XPath问询,根据属性和内容对内容进行对比
原标题:Writing an XPath query to match elements based on attributes and content

我有一些类似这样的 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表达式,如果包含文本 T$topicID as Discussion <corresponding-discussion-id><discussion> 具有 type="foo" 则返回真。

  • 设计一个XPath表达式,该表达式将提取文本Discussion <对应的讨论ID>,假设$topicID是已知的。

这是可能的吗?


Update:

关于第一个,我正在考虑需要类似于:

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将选择属性类型为“foo”且包含文本“T50 as Discussion”(当$ topicid = 50时)的讨论:

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

考虑到一个特别的讨论内容,相应的补贴由以下各方提供:

substring-after(normalize-space(.),  as Discussion  )

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

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>

功能引用:

就我个人而言,如果没有Michael Kay的书陪伴,我无法想象进行严肃的XSLT开发。

问题回答

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

/discussions/discussion[@type=foo AND contains(., T52 )]




相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签