Элемент XML имеет пространство имен, мой XPATH не работает

Мне дали следующий XML:

<root>
  <items>
    <item>
      <title>Item</title>
      <details>
        <data xmlns="http://some_url">
          <length>10</length>
          <weight>1.2</weight>
        </data>
      </details>
    </item>
  </items>
</root>

Следование XPath не работает, то есть ничего не печатается, как & quot; данные & quot; элемент не существует:

/root/items/item/details/data

Но когда я удаляю & quot; xmlns & quot; атрибут пространства имен "данные" элемент его содержимого печатается. Как должно выглядеть выражение xpath без удаления & quot; xmlns & quot; атрибут пространства имен "данные" элемент?

Я использую SAXON и XSL 1.0.

Ответы на вопрос(2)

Решение Вопроса

This is one of the most FAQ in XPath / XSLT:

XPath интерпретирует имя элемента без префикса как принадлежащее «no namespace». и это является причиной, по которой элементы с нефиксированными именами, принадлежащие пространству имен по умолчанию (непустое), не выбираются, когда в качестве теста узла в выражении XPath указано только их нефиксированное имя.

The solution is either:

  1. Create a namespace binding where a prefix (say "x") is associated with the default namespace, then specify x:elementName instead of elementName.

  2. Use long, ugly and unreliable expressions like: *[name() = 'elementName']

Here is an XSLT transformation using the above method1. :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:a="http://some_url">
 <xsl:output method="text"/>

 <xsl:template match="/">
  <xsl:value-of select=
  "/root/items/item/details/a:data/a:weight"/>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied (using Saxon 6.5.4 or any other compliant XSLT 1.0 processor) on the provided XML document:

<root>
    <items>
        <item>
            <title>Item</title>
            <details>
                <data xmlns="http://some_url">
                    <length>10</length>
                    <weight>1.2</weight>
                </data>
            </details>
        </item>
    </items>
</root>

The correct/wanted node is selected and its string value is copied to the output:

1.2

В XPath вы должны назначить префикс для пространства имен. То, как вы это сделаете, зависит от используемого вами программного обеспечения / библиотеки XPath, но при условии, что вы связываете URI пространства имен.http://some_url с префиксом пространства именsomeUrlВы можете изменить выражение XPath следующим образом:

/root/items/item/details/someUrl:data

Ваш ответ на вопрос