Атрибут "xmlns" заставляет мой XSLT возвращать пустые значения - PullRequest
0 голосов
/ 17 марта 2009

У меня есть файл 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>

* РЕДАКТИРОВАТЬ * Вот фрагмент того, что находится в 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>

Ответы [ 2 ]

4 голосов
/ 17 марта 2009

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

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

2 голосов
/ 17 марта 2009

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

...