假设我有一个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。我怎样才能使这个输出成为我期待的呢?
答案 0 :(得分:3)
这里有两个问题 - 首先是你不想指定名称空间前缀,其次是你不希望源文档中有空格来影响你的输出。让我们分别讨论它们。
使用名称空间前缀 简短的答案是否定的 - 您不能编写与特定命名空间中的元素匹配的XSL模板,而无需使用前缀指定此类命名空间。在您的第一个XSLT中,您可以阅读模板定义,例如“我想选择名为Thing的节点没有任何命名空间”,而您真正想要的是“我想选择名为Thing的节点具有命名空间http://My/Project.xsd”。这是XPath 1.0规范的工作方式(this文章中的更多详细信息)。
摆脱间距:
使用样式表开头的<xsl:strip-space elements="*"/>
指令指定您不希望在输出文档中保留所有源元素的空格。如果你想保留其中一些,也可以使用<xsl:preserve-spaces elements="myNode">
。