我有一些这样的 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
),我想执行以下操作:<discussion>
和 type="foo"
包含文本 T$topicID as Discussion <corresponding-discussion-id>
,则该表达式为真。 $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>
函数引用:
就个人而言,如果没有 Michael Kay 的书,我无法想象认真地进行 XSLT 开发。
关于xslt - 编写 XPath 查询以根据属性和内容匹配元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2292975/