Как выбрать элемент в определенном пространстве имен? - PullRequest
2 голосов
/ 09 октября 2008

У меня проблемы с выбором элементов, которые являются частью определенного пространства имен. Мое выражение xpath работает в XMLSpy, но не работает при использовании библиотек Xalan.

<item>
   <media:content attrb="xyz">
     <dcterms:valid>VALUE</dcterms:valid>
  </media:content>
</item>

Мое выражение лица ./item/media:content/dcterms:valid. Я уже добавил оба определения пространства имен в свой XSLT. Опять же, при этом выбираются правильные значения в XMLSpy, но происходит сбой при запуске через библиотеку Xalan.

Есть идеи?

Ответы [ 6 ]

1 голос
/ 12 октября 2008

Вам потребуется реализовать org.apache.xml.utils.PrefixResolver, чтобы сопоставить префикс с URI пространства имен, а затем передать экземпляр в используемый вами экземпляр XPath. Это позволит вам использовать префиксы в выражениях XPath, отличные от префиксов в ваших документах (которые вы можете не контролировать).

Например, вы можете создать реализацию, которая использует пару карт (одну для отображения из префикса -> URI пространства имен, а другую из URI в префикс).

В JAXP эквивалентный реализуемый интерфейс: javax.xml.namespace.NamespaceContext.

0 голосов
/ 12 октября 2008

Вы можете попробовать выбрать XPath для локального имени и (необязательно) указать URI пространства имен. И пример:

/*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()='']

Подробнее см. на этой странице или Google по локальным именам и XPath.

0 голосов
/ 11 октября 2008

Префиксы в XML не имеют смысла, пока они не связаны с определенным пространством имен, и это также верно для выражений XPath - оно не будет совпадать просто потому, что вы использовали тот же префикс.

Вы должны создать свой собственный класс PrefixResolver, который будет предоставлять полные URI пространства имен для префиксов, которые есть в вашем выражении XPath.

0 голосов
/ 10 октября 2008

В каком контексте вы пытаетесь оценить ваш XPath? (Например, XSLT?) Если это корневой элемент, вы можете попробовать удалить начальный символ ".": "/ Item / media: content / dcterms: valid." Если есть серия элементов, вы можете попробовать добавить еще одну косую черту в начале: "// item / media: content / dcterms: valid." При этом будут выбраны все элементы в документе, которые соответствуют этим критериям, независимо от того, где в структуре документа они расположены.

0 голосов
/ 10 октября 2008

Возможно, XMLSpy реализовал спецификацию 2.x XSLT, частью которой я считаю XPath. Xalan, с другой стороны, все еще 1.x.

0 голосов
/ 09 октября 2008

Вы пытались определить пространство имен большого двоичного объекта XML?

<item xmlns:dcterms="http://dcterms.example" xmlns:media="http://media.example">
   <media:content attrb="xyz">
     <dcterms:valid>VALUE</dcterms:valid>
  </media:content>
</item>

т.е.

...