2

XPath 1.0と以下のXMLを使用して、「b」の親を持つすべての「c」ノードを選択するにはどうすればよいですか。「b」の親に「c」ノードがない場合は「」を選択します。つまり{"c1", "", "c3"}、結果のノードとして取得します。セット(ドキュメント順)?

私はVTD-XML2.11(Java)を使用しており、ループせずに上記の結果を返す単一のXPath評価を探しています。

<a>
  <b>
    <c>c1</c>
  </b>
  <b/>
  <b>
    <c>c3</c>
  </b>
</a>

私は質問を閲覧し、オリバー・ベッカーの方法などの興味深い指針を見つけましたが、これまでのところ解決策を見つけることができませんでした。

どんな助けでもいただければ幸いです。

ありがとう。

4

2 に答える 2

1

これらの XPath を評価するために何を使用していますか? 優れたアプローチは思い浮かびませんが、使用しているものによっては、すべてのbs を選択して繰り返し処理し、それぞれに c の値または空白の値を使用するのは簡単です。

これは優れたアプローチではありませんが、サンプル入力に対しては機能します。

//b/c | //b[not(*)] | //b[not(c) and *]/text()

説明は次のとおりです。

  • ca の下にあるすべての を選択しますb
  • b子要素がない場合は、要素自体を選択します
  • b子を持たない の最初のテキスト ノードを選択しますc

bこれは、子要素を持つすべての要素に少なくとも 1 つのテキスト ノードがあり、それらの最初のノードが完全に空白であると仮定して機能します。

XSLT による検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <root>
      <xsl:for-each select="//b/c | //b[not(*)] | //b[not(c) and *]/text()[1]">
        <item>
          <xsl:value-of select="."/>
        </item>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行したときの出力:

<root>
  <item>c1</item>
  <item></item>
  <item>c3</item>
</root>
于 2013-02-05T16:53:50.657 に答える
0

このようなもの?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.IO;

namespace Xpath
{
    class Program
    {
        static void Main(string[] args)
        {

            string xml = @"<a>
              <b>
                <c>c1</c>
              </b>
              <b/>
              <b>
                <c>c3</c>
              </b>
              <b>x</b>
            </a>";

            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);

            string xpath = "//b/c/text()|//b[count(child::*) = 0]|//b[count(child::*) = 0]/text()";

            StringReader stringReader = new StringReader(xml);
            XmlReader xmlReader = XmlReader.Create(stringReader);

            XPathDocument xpathDoc = new XPathDocument(xmlReader);

            XPathNavigator xpathNav = xpathDoc.CreateNavigator();
            XPathNodeIterator xpathIter = xpathNav.Select(xpath);

            foreach (XPathNavigator navigator in xpathIter)
            {
                if (navigator.ValueType == typeof(string))
                {
                    Console.WriteLine("'" + navigator.Value + "'");
                }
            }
        }
    }
}

出力は次のとおりです。

'c1'
''
'c3'
'x'
于 2013-02-05T17:15:13.607 に答える