XSLT和命名空间的问题

时间:2009-03-27 11:46:06

标签: xml 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中,则不会检测到内部标记。关于为什么会发生这种情况的任何线索?

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:1)

XSLT需要声明与XML文件相同的名称空间。也许你的ns2声明在两个文件之间略有不同?特别注意字母(区分大小写)和尾部斜线等情况。命名空间字符串必须完全匹配。

如果这没有帮助,也许您可​​以发布一个完整的XML和XSLT文件来演示您遇到的问题?

答案 2 :(得分:0)

哎哟!

在准备完整的XML和XSLT时,我意识到两个文件中的命名空间都指的是不同的模式:(

因此,他们使用相同的名称,通过使用不同的模式使它们不同

非常感谢你指点我正确的方向:)