Синтаксический анализ xml с использованием xslt завершается неудачно при добавлении пространства имен в xml - PullRequest
3 голосов
/ 17 октября 2011

У меня есть следующий XML-файл:

<DataConfiguration 
  xmlns="http://www.mysite.com/namespace"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.mysite.com/namespace/DataConfiguration.xsd">

  <rule>
    <if>
       ...
    </if>
    <then>
       ...
    </then>
  </rule>

</DataConfiguration>

который я хочу проанализировать с помощью следующего xslt:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:doc="http://www.mysite.com/namespace" 
  exclude-result-prefixes="xsi">

<xsl:output omit-xml-declaration="yes"/>
<xsl:output method="text"/>
<xsl:template match = "/">

<xsl:for-each select="//rule">
  <xsl:for-each select="if/*">
     ...
  </xsl:for-each>
</xsl:for-each>

</xsl:template>
</xsl:stylesheet>

xslt работает должным образом, но когда я добавляю атрибут xmlns в верхний элемент xml, он не может найти элементы xml. Я видел некоторые связанные вопросы на этом сайте, но все еще не понял, как решить мою конкретную проблему. Я попытался добавить doc: к выбору, как предложено здесь , но это не помогло. Может быть, это потому, что я использую //? Есть ли другой способ сделать эти запросы?

Любое другое предложение, как решить эту проблему?

1 Ответ

4 голосов
/ 17 октября 2011

Это самый большой XPath XSLT FAQ.Просто поиск: "XPath default namespace"

Очень кратко :

Изменение:

<xsl:for-each select="//rule">   
  <xsl:for-each select="if/*">   
     ...   
  </xsl:for-each>   
</xsl:for-each> 

Кому:

<xsl:for-each select="//doc:rule">   
  <xsl:for-each select="doc:if/*">   
     ...   
  </xsl:for-each>   
</xsl:for-each> 

Причиной наблюдаемой запутанной проблемы является то, что в XPath любое нефиксированное имя считается находящимся в «пространстве имен».

Следовательно, select="//rule" не выбирает ни одного элемента вдокумент, который находится в пространстве имен по умолчанию - нет элемента с именем rule, который не находится в пространстве имен.

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

...