我是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中,则不会检测到内部标记。关于为什么会发生这种情况的任何线索?
谢谢!
答案 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时,我意识到两个文件中的命名空间都指的是不同的模式:(
因此,他们使用相同的名称,通过使用不同的模式使它们不同
非常感谢你指点我正确的方向:)