我正在尝试使用xpath从注释或后面的文本返回值“Vancouver”。有人能指出我正确的方向吗?
位置li始终是第一个项目,但并不总是存在,并且每个项目后列表项目的数量会有所不同。
<item>
<title>
<description>
<!-- Comment #1 -->
<ul class="class1">
<li> <!-- ABC Location=Vancouver -->Location: Vancouver</li>
<li> <!-- More comments -->Text</li>
<li> text</li>
</ul>
</description>
</item>
答案 0 :(得分:2)
这将在评论后从文本中删除:
substring-after(//ul[@class='class1']/li[position()=1 and contains(.,'Location:')],'Location: ')
这指定了类'class1'的<li>
内的第一个<ul>
,仅当它包含'Location:'时,并在'Location:'之后取字符串。如果你想放宽它作为第一个li的要求,请使用:
substring-after(//ul[@class='class1']/li[contains(.,'Location:')],'Location: ')
答案 1 :(得分:0)
这不是雄辩的,如果您的“位置:#####”要在结构上进行更改,它可能会导致问题,因为这是一个静态解决方案,但它适用于上述情况:
substring(//item//li[1],12,string-length(//item//li[1])-10)
这将返回等效的字符串,而不是节点。 冲了一下这个,所以我会随着时间的推移给出一个更好的解决方案,但这只是需要考虑的事情...... (它只是剥离“位置:”并返回它之后的任何内容..)
答案 2 :(得分:0)
使用强>:
substring-after(/*/description/ul
/li[1]/text()[starts-with(., 'Location: ')],
'Location: '
)
要从评论中提取位置:
substring-after(/*/description/ul
/li[1]/comment()[starts-with(., ' ABC Location=')],
' ABC Location='
)
基于XSLT的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select=
"substring-after(/*/description/ul
/li[1]/text()[starts-with(., 'Location: ')],
'Location: '
)
"/>
==========
<xsl:copy-of select=
"substring-after(/*/description/ul
/li[1]/comment()[starts-with(., ' ABC Location=')],
' ABC Location='
)
"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<item>
<title/>
<description>
<!-- Comment #1 -->
<ul class="class1">
<li>
<!-- ABC Location=Vancouver -->Location: Vancouver
</li>
<li>
<!-- More comments -->Text
</li>
<li> text</li>
</ul>
</description>
</item>
评估两个XPath表达式,并将评估结果复制到输出中:
Vancouver
==========
Vancouver