xpath для выбора на основе одного элемента XML, но получить другой элемент - PullRequest
0 голосов
/ 20 апреля 2011

Это усеченный пример одной записи в каком-то автоматически сгенерированном XML, с которым мне нужно работать.

<marcrecord>
<marcdatafield tag="245" ind1="0" ind2="0">
      <marcsubfield code="a">Argumentation and advocacy :</marcsubfield>
      <marcsubfield code="b">the journal of the American Forensic Association.</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="246" ind1="1" ind2="7">
      <marcsubfield code="a">Journal of the American Forensic Association</marcsubfield>
      <marcsubfield code="f">summer 1988-spring 1989</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="246" ind1="3" ind2="">
      <marcsubfield code="a">Argumentation &amp; advocacy</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="260" ind1="" ind2="">
      <marcsubfield code="a">[River Falls, WI] :</marcsubfield>
      <marcsubfield code="b">The Association,</marcsubfield>
      <marcsubfield code="c">[1988-</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="300" ind1="" ind2="">
      <marcsubfield code="a">v. ;</marcsubfield>
      <marcsubfield code="c">26 cm.</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="650" ind1="" ind2="0">
      <marcsubfield code="a">Forensics (Public speaking)</marcsubfield>
      <marcsubfield code="v">Periodicals.</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="710" ind1="2" ind2="">
      <marcsubfield code="a">American Forensic Association.</marcsubfield>
    </marcdatafield>
    <marcdatafield tag="780" ind1="0" ind2="0">
      <marcsubfield code="a">American Forensic Association.</marcsubfield>
      <marcsubfield code="t">Journal of the American Forensic Association</marcsubfield>
      <marcsubfield code="x">0002-8533</marcsubfield>
      <marcsubfield code="w">(DLC)sf 80000452</marcsubfield>
      <marcsubfield code="w">(OCoLC)1479880</marcsubfield>
    </marcdatafield>
 <marcrecord>

Мне нужно показать данные в поле marcdata, помеченные как 780 (в частности, одно подполе, закодированное t). Определенное подполе 780 для извлечения основано на поиске совпадения в предыдущем подполе поля данных, помеченного как 245 (это заголовок)

Строка поиска заголовка пользователя находится в переменной с названием title, и XPath, представленный ниже, похоже, делает достойную работу по поиску конкретной записи на основе совпадения заголовка.

XPathExpression expr = xpath.compile ("// marcdatafield [marcsubfield = '" + title + "'] / * / text ()");

Но я озадачен тем, как заставить его на самом деле получить соответствующее поле 780, а не только поле заголовка. (FWIW, это использует нативные классы Java XPath, и я буду использовать его в JSP)

Спасибо за любую помощь,

Ceci

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Я думаю, что вы ищете это:

//marcdatafield/marcsubfield[@code='t'][//marcdatafield[@tag='246']/marcsubfield[@code='a']/text()]

Я предполагаю, что вы действительно имели в виду заголовок в подполе тега 246, помеченный тегом a, потому что этот заголовок совпадает, а заголовок в подполе тега 245 b desn 'т.

Это сделает ваш код:

XPathExpression expr = xpath.compile("//marcdatafield/marcsubfield[@code='t'][//marcdatafield[marcsubfield='" +title+ "']/*/text()]");
0 голосов
/ 20 апреля 2011

попробуйте этот пример:

XPathFactory factory = XPathFactory.newInstance();
    XPath xPath = factory.newXPath();
    NodeList shows = (NodeList) xPath.evaluate("/schedule/show", new InputSource(new FileReader(
        "tds.xml")), XPathConstants.NODESET);
    for (int i = 0; i < shows.getLength(); i++) {
      Element show = (Element) shows.item(i);
      String guestName = xPath.evaluate("guest/name", show);
      String guestCredit = xPath.evaluate("guest/credit", show);
      System.out.println(show.getAttribute("weekday") + ", " + show.getAttribute("date") + " - "
          + guestName + " (" + guestCredit + ")");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...