проблема пространства имен xsl - PullRequest
5 голосов
/ 23 августа 2011

Если у меня есть этот XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html"/>
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/>

    <xsl:template match='/'>
      <xsl:value-of select="//Description" />
    </xsl:template>
</xsl:stylesheet>

А это XML

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <LookupValue>
    <Description>AGL</Description>
    <Value>8</Value>
  </LookupValue>
  <LookupValue>
    <Description>Australian Power &amp; Gas</Description>
    <Value>6</Value>
  </LookupValue>
  <LookupValue>
    <Description>EnergyAustralia</Description>
    <Value>13</Value>
  </LookupValue>
  <LookupValue>
    <Description>Origin Energy</Description>
    <Value>9</Value>
  </LookupValue>
  <LookupValue>
    <Description>TRU Energy</Description>
    <Value>7</Value>
  </LookupValue>
</ArrayOfLookupValue>

Как мне получить некоторые данные из этой строки:

<xsl:value-of select="//Description" />

Я потратил на это часы и пришел к выводу, что пространство имен xmlns = вызывает у меня горе.

Любая помощь с благодарностью.

Кстати, XML приходит из веб-службы, поэтому я не могу просто «изменить» его - я могу предварительно обработать его, но это не идеально ...

Также я подтвердил, что удаление пространств имен из макета XML действительно решает проблему.

1 Ответ

12 голосов
/ 23 августа 2011

Это наиболее часто задаваемые вопросы как для XPath, так и для XSLT .

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

Поэтому для такого документа выбирается выражение

//Description

ничто (потому что в документе нет элемента Description (или любого другого), который принадлежит "пространству имен" - все имена элементов принадлежат пространству имен по умолчанию).

Решение:

Определите пространство имен в вашем XSLT, которое имеет тот же namespace-uri(), что и пространство имен по умолчанию для документа XML.Затем используйте префикс определенного таким образом пространства имен для любого имени, используемого в выражении Xpath:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://switchwise.com.au/">
    <xsl:output method="html"/>
    <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/>

    <xsl:template match='/'>
      <xsl:copy-of select="//x:Description" />
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML :

<ArrayOfLookupValue xmlns="http://switchwise.com.au/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <LookupValue>
    <Description>AGL</Description>
    <Value>8</Value>
  </LookupValue>
  <LookupValue>
    <Description>Australian Power &amp; Gas</Description>
    <Value>6</Value>
  </LookupValue>
  <LookupValue>
    <Description>EnergyAustralia</Description>
    <Value>13</Value>
  </LookupValue>
  <LookupValue>
    <Description>Origin Energy</Description>
    <Value>9</Value>
  </LookupValue>
  <LookupValue>
    <Description>TRU Energy</Description>
    <Value>7</Value>
  </LookupValue>
</ArrayOfLookupValue>

желаемый, правильный результат выдается :

<Description xmlns="http://switchwise.com.au/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>AGL</Description>
<Description xmlns="http://switchwise.com.au/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>Australian Power &amp; Gas</Description>
<Description xmlns="http://switchwise.com.au/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>EnergyAustralia</Description>
<Description xmlns="http://switchwise.com.au/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>Origin Energy</Description>
<Description xmlns="http://switchwise.com.au/"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
>TRU Energy</Description>
...