Атрибут xmlns заставляет мой XSLT возвращать пустые значения

У меня есть файл XML, который я пытаюсь преобразовать с помощью файла XSL. Как только я добавляю непустой атрибут xmlns в корневой элемент моего XSL, преобразование просто возвращает мне пустые данные для всего. Если я удалю или удалю атрибут xmlns, я верну то, что ожидаю.

Может ли кто-нибудь сказать мне, почему это происходит, чтобы я мог остановить это!

Вот немного моего XSL (некоторые части опущены и заменены на...):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ... >

  <xsl:import href="html_commonstructures.xsl"/>
  <xsl:output method="html"/>

  <xsl:template match="/">
    <div>
    <xsl:call-template name="ServiceStructure">
      <xsl:with-param name="structure" select="ServiceDescription" />
    </xsl:call-template>
    </div>
  </xsl:template>

  <xsl:template name="ServiceStructure">
    <xsl:param name="structure"/>
    <h3>
      <xsl:value-of select="$structure/DC.Title" /> (<xsl:value-of select="$structure/DC.Identifier" />)
    </h3>
    <!-- And so on -->
  </xsl:template>
</xsl:stylesheet>

* EDIT * Вот фрагмент того, что находится в html_commonstructures:

<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rxr="http://ilrt.org/discovery/2004/03/rxr/" xmlns:esd="http://www.esd.org.uk/standards"
    xmlns:core="http://www.govtalk.gov.uk/core" xmlns:n2="http://www.govtalk.gov.uk/metadata/egms"
    xmlns:apd="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails"
    xmlns:con="http://www.govtalk.gov.uk/people/ContactTypes"
    xmlns:bs7666="http://www.govtalk.gov.uk/people/bs7666">

  <!-- A template for the ControlledListStructures -->
  <xsl:template name="ControlledListStructure">
    <xsl:param name="structure"/>

    <p class="controlledlist">
      <xsl:value-of select="$structure/text()" />
      <xsl:if test="$structure/@Id | $structure/@ConceptId | $structure/@ItemName | $structure/@ListName">
        <span class="metainfo">[
          <xsl:if test="$structure/@Id">
            ID: <xsl:value-of select="$structure/@Id" />;
          </xsl:if>
          <xsl:if test="$structure/@ConceptId">
            Concept ID: <xsl:value-of select="$structure/@ConceptId" />;
          </xsl:if> 
          <xsl:if test="$structure/@ItemName">
            Item Name: <xsl:value-of select="$structure/@ItemName" />;
          </xsl:if>
          <xsl:if test="$structure/@ListName">
            List Name: <xsl:value-of select="$structure/@ListName" />
          </xsl:if>
          ]
        </span>
      </xsl:if>
    </p>
  </xsl:template>
</xsl:stylesheet>

person Lee Theobald    schedule 17.03.2009    source источник
comment
Я думаю, что видел подобные вещи из-за конфликтов импорта, не могли бы вы также предоставить html_commonstructures.xsl, пожалуйста?   -  person annakata    schedule 17.03.2009


Ответы (2)


Почему вы добавляете определение пространства имен xmlns в первую очередь?

Добавляя атрибут xmlns, вы изменяете пространство имен по умолчанию для своего XSLT. Затем вы должны настроить все выражения для использования пространства имен вашего входного документа, т.е. добавить определение пространства имен вашего входного документа, используя свободный префикс, и заменить, например. выражение «ServiceDesription» с «myPrefix: SerciveDescription».

person Dirk Vollmar    schedule 17.03.2009
comment
XML, который я пытаюсь преобразовать, исходит от третьей стороны, поэтому у меня нет особого контроля над пространствами имен и т. д. Приветствую ввод, хотя - я посмотрю, смогу ли я вообще что-то изменить, чтобы помочь. - person Lee Theobald; 17.03.2009

Если у вас есть пространство имен в XML-документе, то такое же пространство имен должно быть и в XSLT.

person Andrew Hare    schedule 17.03.2009