У меня проблемы с выбором элементов, которые являются частью определенного пространства имен. Мое выражение xpath работает в XMLSpy, но не работает при использовании библиотек Xalan.
<item>
<media:content attrb = "xyz">
<dcterms:valid>VALUE</dcterms:valid>
</media:content>
</item>
Мое выражение - ./item/media:content/dcterms:valid. Я уже добавил оба определения пространства имен в свой XSLT. Опять же, это выбирает правильные значения в XMLSpy, но не работает при работе через библиотеку Xalan.
Есть идеи?





Вы пытались определить пространство имен блоба XML?
<item xmlns:dcterms = "http://dcterms.example" xmlns:media = "http://media.example">
<media:content attrb = "xyz">
<dcterms:valid>VALUE</dcterms:valid>
</media:content>
</item>
т.е.
Возможно, XMLSpy реализовал спецификацию XSLT 2.x, частью которой, как мне кажется, является XPath. С другой стороны, Xalan по-прежнему 1.x.
В каком контексте вы пытаетесь оценить свой XPath? (Например, XSLT?) Если это корневой элемент, вы можете попробовать удалить ведущий «.»: «/ Item / media: content / dcterms: valid». Если есть ряд элементов, вы можете попробовать добавить еще одну косую черту в начале: «// item / media: content / dcterms: valid». Это выберет все элементы в документе, которые соответствуют этим критериям, независимо от того, где в структуре документа они расположены.
Префиксы в XML не имеют смысла, пока они не привязаны к определенному пространству имен, и это также верно для выражений XPath - оно не будет соответствовать просто потому, что вы использовали тот же префикс.
Вы должны создать свой собственный класс PrefixResolver, который будет давать полные URI пространства имен для префиксов, которые есть в вашем выражении XPath.
Вам нужно будет реализовать org.apache.xml.utils.PrefixResolver для сопоставления префикса с URI пространства имен, а затем передать экземпляр в экземпляр XPath, который вы используете. Это позволит вам использовать префиксы в выражениях XPath, отличные от префиксов в ваших документах (которые вы можете не контролировать).
Например, вы можете создать реализацию, которая использует пару сопоставлений (одну для сопоставления из префикса -> URI пространства имен, а другую для преобразования из URI в префикс).
В JAXP необходимо реализовать эквивалентный интерфейс javax.xml.namespace.NamespaceContext.
Вы можете попробовать выбрать XPath для локального имени и (необязательно) указать URI пространства имен. И пример:
/*[local-name()='NewHireList' and namespace-uri()='http://BRE.NewHireList']/*[local-name()='Record' and namespace-uri()='']
Дополнительную информацию см. В эта страница или в Google по local-name и XPath.
Существуют спецификации XPath 1.0 и XPath 2.0, которые соответствуют (в основном) выпускам XSLT 1.0 и XSLT 2.0. XPath, который он пытается использовать, является допустимым XPath 1.0.