2009-03-17 9 views
0

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

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

Вот немного моего 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> 
+0

Я * думаю * Я видел такие вещи из конфликтов импорта, можете ли вы предоставить html_commonstructures.xsl, пожалуйста? – annakata

ответ

4

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

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

+0

XML, который я пытаюсь преобразовать, поступает от третьего лица, поэтому у меня нет большого контроля над пространствами имен и т. Д. Приветствия для ввода, хотя - я посмотрю, смогу ли я вообще что-то сделать, чтобы помочь. –

2

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