我有一些这样的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),我想做以下工作:
T$topicID as Discussion <corresponding-discussion-id>的<discussion>和type="foo",则该表达式为真。$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.发布于 2010-02-18 23:29:13
下面的XPath将选择type=属性为“foo”,并包含文本"T50作为讨论“(当$topicid=50时)。
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]给定一个特定的讨论元素,相应的id由以下方法提供:
substring-after(normalize-space(.),' as Discussion ')我们可以通过替换“2”来组合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的书,我无法想象进行认真的XSLT开发。
发布于 2010-02-18 23:28:31
是否讨论过type=foo包含相应的topicID
/discussions/discussion[@type=foo AND contains(.,'T52')]https://stackoverflow.com/questions/2292975
复制相似问题