我想使用XPath来检索两个节点中的较长节点。
例如,如果我的XML是
<record>
<url1>http://www.google.com</url1>
<url2>http://www.bing.com</url2>
</record>
我做文件.SelectSingleNode(你的XPath在这里)
我希望能回到url1节点。如果url2更长,或者没有url1节点,我希望得到url2节点。
看起来很简单,但我无法搞清楚。有什么想法吗?
答案 0 :(得分:1)
这适合我,但它很难看。你不能在XPath之外进行比较吗?
record/*[starts-with(name(),'url')
and string-length(.) > string-length(preceding-sibling::*[1])
and string-length(.) > string-length(following-sibling::*[1])]/text()
答案 1 :(得分:0)
<xsl:for-each select="*">
<xsl:sort select="string-length(.)" data-type="number"/>
<xsl:if test="position() = last()">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
甚至适用于XSLT 1.0!
答案 2 :(得分:0)
使用此单个XPath表达式:
/*/*[not(string-length(preceding-sibling::*|following-sibling::*)
>
string-length()
)
]
基于XSLT的验证:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*[not(string-length(preceding-sibling::*|following-sibling::*)
>
string-length()
)
]"/>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<record>
<url1>http://www.google.com</url1>
<url2>http://www.bing.com</url2>
</record>
评估Xpath表达式并将此评估结果(所选元素)复制到输出:
<url1>http://www.google.com</url1>