2

XPath を使用して、2 つのノードのうち長い方を取得したいと考えています。

たとえば、私のXMLが

<record>
   <url1>http://www.google.com</url1>
   <url2>http://www.bing.com</url2>
</record>

そして、私は document.SelectSingleNode( your XPath here )を行います

url1 ノードが返されることを期待しています。url2 が長い場合、または url1 ノードがない場合は、url2 ノードが返されることを期待しています。

単純なようですが、私はそれを理解するのに苦労しています。何か案は?

4

3 に答える 3

1

これは私にとってはうまくいきますが、醜いです。XPath の外部で比較を行うことはできませんか?

record/*[starts-with(name(),'url')
         and string-length(.) > string-length(preceding-sibling::*[1])
         and string-length(.) > string-length(following-sibling::*[1])]/text()
于 2012-09-21T20:02:03.143 に答える
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>
于 2012-09-22T02:43:37.493 に答える
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 でも動作します!

于 2012-09-21T21:42:48.233 に答える