如何使用默认命名空间编写XSL?

时间:2011-04-01 03:25:14

标签: xml xslt namespaces transform xml-namespaces

假设我有一个XML文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<Project xmlns="http://My/Project.xsd">
    <Thing Name="test"/>
</Project>

我的XSLT是:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns="http://My/Project.xsd">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>

    <xsl:template match="Thing">
        <xsl:value-of select="@Name"/>
    </xsl:template>
</xsl:stylesheet>

输出为[NewLine][Tab][NewLine],与XML文件的间距相匹配。

如果我将我的XSLT改为:(添加了前缀)

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:N="http://My/Project.xsd">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>

    <xsl:template match="N:Thing">
        <xsl:value-of select="@Name"/>
    </xsl:template>
</xsl:stylesheet>

输出为[NewLine][Tab]test[NewLine],它再次与XML文件的间距匹配,但包含“Name”属性的值。

我的预期输出只是test。没有新行,没有标签 - 它根本不应该遵循XML文件的格式。

我想在不使用前缀的情况下编写XML和XSLT。我怎样才能使这个输出成为我期待的呢?

1 个答案:

答案 0 :(得分:3)

这里有两个问题 - 首先是你不想指定名称空间前缀,其次是你不希望源文档中有空格来影响你的输出。让我们分别讨论它们。

使用名称空间前缀 简短的答案是否定的 - 您不能编写与特定命名空间中的元素匹配的XSL模板,而无需使用前缀指定此类命名空间。在您的第一个XSLT中,您可以阅读模板定义,例如“我想选择名为Thing的节点没有任何命名空间”,而您真正想要的是“我想选择名为Thing的节点具有命名空间http://My/Project.xsd。这是XPath 1.0规范的工作方式(this文章中的更多详细信息)。

摆脱间距: 使用样式表开头的<xsl:strip-space elements="*"/>指令指定您不希望在输出文档中保留所有源元素的空格。如果你想保留其中一些,也可以使用<xsl:preserve-spaces elements="myNode">