Kev*_*gel 4 string xslt xpath expression
我有一些像这样的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>
Run Code Online (Sandbox Code Playgroud)
给定一个特定的主题ID($topicID),我想做以下事情:
设计一个XPath表达式,如果有包含该文本的<discussion>with type="foo",则为true 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.
Run Code Online (Sandbox Code Playgroud)
以下XPath将选择讨论属性type ="foo"并包含文本"T50 as Discussion"(当$ topicid = 50时).
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
Run Code Online (Sandbox Code Playgroud)
给定一个特定的讨论元素,相应的id由下式给出:
substring-after(normalize-space(.),' as Discussion ')
Run Code Online (Sandbox Code Playgroud)
我们可以通过替换"."来组合2.在第二个表达式中包含整个第一个表达式.请注意,如果多个讨论与内部表达式匹配,我们将从第二个讨论中连接它们的值.
substring-after(normalize-space(
//discussions/discusson[@type='foo' and contains(., concat('T', $topicid, ' as Discussion ')]
),' as Discussion ')
Run Code Online (Sandbox Code Playgroud)
如果有多个匹配的讨论,您可以像这样处理它们:
<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>
Run Code Online (Sandbox Code Playgroud)
功能参考:
就个人而言,如果没有Michael Kay的书,我无法想象进行严肃的XSLT开发.
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |