【发布时间】:2012-09-18 22:23:09
【问题描述】:
我有一个 XSLT 样式表,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/">
<saxon:script language="java" implements-prefix="XQHeaderFunc" src="java:com.sonicsw.xq.service.xform.HeaderExtension" />
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="processId" select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
<xsl:value-of select="XQHeaderFunc:setProperty(XQHeaderFunc:new(),'processId',string(@id),-1)"/>
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<!-- Other stuff -->
</xsl:stylesheet>
我想使用第二个 XSLT 样式表转换此样式表,以删除与 XQHeaderFunc 和 saxon 命名空间有关的任何内容。有什么办法可以做到吗?
我现在尝试了以下方法,成功处理了元素,但命名空间声明似乎不想消失。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="XQHeaderFunc saxon">
<xsl:param name="XQHeaderReplacement" />
<xsl:variable name="apos">'</xsl:variable>
<!-- Copy all nodes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Remove saxon script tag -->
<xsl:template match="saxon:script" />
<!-- Remove elements with setProperty calls -->
<xsl:template match="*[starts-with(@select, 'XQHeaderFunc:setProperty')]" />
<!-- Replace getProperty calls with replacement value-->
<xsl:template match="@select[starts-with(., 'XQHeaderFunc:getProperty')]">
<xsl:attribute name="select">
<xsl:value-of select="concat($apos, $XQHeaderReplacement, $apos)"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
输出:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/">
<xsl:output indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/">
<xsl:variable name="processId" select="''" />
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<!-- Other stuff -->
</xsl:stylesheet>
【问题讨论】:
-
请提供完整的源 XML 文档(第一个样式表)。有些操作必须完成,而您似乎并不知道。通常,简单地删除命名空间声明会导致非(命名空间)格式良好的结果,XSLT 处理器将通过生成新的命名空间声明来防止这种情况发生。
-
用更具体的来源和我现在尝试过的新示例更新了问题。
-
您的更新很有帮助,但请发布您从转换中获得的实际结果。这将帮助我们准确了解它的外观,以便我们可以帮助找出为什么它仍然具有 ns decl。
-
添加了两个 xslt 文件的确切来源以及在 Visual Studio 2012 中运行后的输出来源。
-
好的,谢谢。看着它。为什么删除命名空间声明对您如此重要?您知道它应该对输出 XML 的语义没有有意义的影响,对吧?
标签: xslt xslt-1.0 xml-namespaces