Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Lee TheobaldОтветов: 2

У меня есть файл 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>
  • Я думаю, что видел подобные вещи из-за конфликтов импорта, не могли бы вы также предоставить html_commonstructures.xsl, пожалуйста? annakata 17.03.2009

xmlxslt

Ответы

Ответ 1 · рейтинг 4 · Dirk Vollmar

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

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

Ответ 2 · рейтинг 2 · Andrew Hare

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы