2011-02-10 67 views
2

下面的xslt代码不适用于下面的XML文件。但是,如果我从xml文件的“对象”节点中删除命名空间属性,它将按预期工作。我如何修复xslt代码,以便在根节点中具有名称空间属性时它能够正常工作?首先发布,抱歉如果格式化搞砸了。由于在根节点中声明名称空间时xslt脚本不起作用

XML文件:

<objects xmlns="http://www.spicefactory.org/parsley" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
<object id="models" type="blah"> 

</object> 
</objects> 

XSLT代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" indent="no"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="object"> 
    <object new_attr="attr value "> 
    <xsl:apply-templates select="node()|@*"/> 
    </object> 
</xsl:template> 
</xsl:stylesheet> 
+0

可能重复具有默认命名空间设置为xmlns的XML源代码](http://stackoverflow.com/questions/1344158/xslt-with-xml-source-that-has-a-default-namespac e-set-to-xmlns) – 2011-02-12 15:35:09

回答

10

您需要申报,并在XSLT使用相同的XML命名空间:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sfp="http://www.spicefactory.org/parsley"> 

<xsl:output method="xml" indent="no"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="sfp:object"> 
    <sfp:object new_attr="attr value "> 
    <xsl:apply-templates select="node()|@*"/> 
    </sfp:object> 
</xsl:template> 
</xsl:stylesheet> 
[XSLT与
+0

非常感谢Phillip,它帮助我缩小了范围。它与我的xml中的默认命名空间有关。如果默认名称空间位于xml中,则我的xslt转换不起作用。如果默认名称空间从我的xml中被删除,则xslt转换将起作用。所以,我可以让我的变换工作,并保持默认名称空间在XML?谢谢。 – dt1000 2011-02-11 02:44:32

相关问题