2009-03-27 4 views
3

Я новичок в XSLT, поэтому на этот вопрос, возможно, были ответы в другое время. Я искал, но я не нашел ничего :(Проблема с XSLT и пространствами имен

Мне нужно разобрать XML, как этот

<ns1:tagName1> 
    <ns2:tagName2> 
      This is the content 
    </ns2:tagName2>  
</ns1:tagName1> 

И я с помощью этого XSL для этого

<xsl:template match="ns1:tagName1"> 
    <resultns1> 
     <xsl:if test="ns2:tagName2"> 
      <resultns2> 
       <xsl:value-of select="."> 
      </resultns2> 
     </xsl:if> 
    </resultns1> 
</xsl:template> 

Результат, который я ожидаю является

<resultns1> 
    <resultns2> 
     This is the content 
    </resultns2>  
</resultns1> 

, но вместо этого, все, что я получаю

<resultns1/> 

Если оба тега используют одно и то же пространство имен, все работает так, как ожидалось, но если внешний тег находится в ns1, а внутренний - в ns2, то внутренний не обнаружен. Какие-нибудь подсказки о том, почему это происходит?

Спасибо!

ответ

4

Это прекрасно работает для меня; XML:

<?xml version="1.0" encoding="utf-8" ?> 
<xml xmlns:ns1="foo" xmlns:ns2="bar"> 
    <ns1:tagName1> 
    <ns2:tagName2> 
     This is the content 
    </ns2:tagName2> 
    </ns1:tagName1> 
</xml> 

XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns1="foo" xmlns:ns2="bar" 
    exclude-result-prefixes="ns1 ns2" 
> 
    <xsl:template match="/xml"> 
    <xsl:apply-templates select="*"/> 
    </xsl:template> 

    <xsl:template match="ns1:tagName1"> 
    <resultns1> 
     <xsl:if test="ns2:tagName2"> 
     <resultns2> 
      <xsl:value-of select="."/> 
     </resultns2> 
     </xsl:if> 
    </resultns1> 
    </xsl:template> 
</xsl:stylesheet> 

Результат:

<?xml version="1.0" encoding="utf-8"?> 
<resultns1> 
    <resultns2> 
    This is the content 
    </resultns2> 
</resultns1> 
1

XSLT должен объявлять те же пространства имен, что и файл XML. Возможно, ваше объявление ns2 немного отличается между двумя файлами? Будьте особенно осторожны с такими вещами, как случай букв (чувствительный к регистру) и трейлинг-косые черты и тому подобное. Строки пространства имен должны точно совпадать.

Если это не поможет, возможно, вы можете опубликовать полный XML-файл и XSLT-файл, демонстрирующий проблему, с которой вы сталкиваетесь?

0

Ой!

при подготовке полного XML и XSLT, я понял, что пространство имен в обоих файлах имели в виду различные схемы :(

Так altought они используют такое же имя, используя различные схемы их отличает

Спасибо очень для того, чтобы навести меня в правильном направлении :)

+0

Вы должны иметь возможность использовать другой псевдоним, чтобы сделать то же самое. –

Смежные вопросы