gpt4 book ai didi

xslt - 使用 XSLT 从 XSLT 样式表中删除命名空间声明

转载 作者:行者123 更新时间:2023-12-04 14:51:11 29 4
gpt4 key购买 nike

我有一个 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 namespace 有关的任何内容。有没有办法做到这一点?

我现在尝试了以下方法,它成功地处理了元素,但 namespace 声明似乎不想消失。
<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>

最佳答案

我会补充

 exclude-result-prefixes="foo"

到你的
 <xsl:stylesheet>

元素。然后,如果可能,将省略 foo 的命名空间声明,即如果该命名空间中没有要输出的元素或属性。

仅供引用,这条线的原因
<xsl:template match="xsl:stylesheet/@xmlns:foo" />`

抛出错误是因为输入文档中的 xmlns:foo 不是属性;这是一个伪属性。您的匹配模式要求匹配的是名为 foo 的属性,该属性位于与命名空间前缀 xmlns 相对应的命名空间中。由于您尚未在样式表中声明 namespace 前缀 xmlns,因此您会收到错误“未定义前缀 xmlns”。

更新:

我从您发布的输出(以及我自己的测试)中看到 exclude-result-prefixes 在删除命名空间声明方面无效。

1)首先我会问为什么这很重要。它不会更改输出 XSLT 中任何内容的 namespace 。您是否只是出于美学原因试图将其删除?

2)查看 XSLT 1.0 spec, it appears to me <xsl:copy> 没有关注 exclude-result-prefixes :

Instantiating the xsl:copy element creates a copy of the current node. The namespace nodes of the current node are automatically copied as well...



AFAICT,只有文字结果元素会省略基于 exclude-result-prefixes 的命名空间节点。

在此基础上,我会尝试用 <xsl:copy> 或其某些变体替换您的身份模板(用于元素)中的 <xsl:element name="{name()}">。然后,您将需要一个用于非元素节点的单独身份模板。

我用以下两个模板替换了您的身份模板:
<!-- Copy elements -->
<xsl:template match="*" priority="-1">
<xsl:element name="{name()}">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>

<!-- Copy all other nodes -->
<xsl:template match="node()|@*" priority="-2">
<xsl:copy />
</xsl:template>

这给出了我认为所需的输出,没有多余的 ns 声明:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<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>

(为了清晰起见,我已经调整了空格。)

关于xslt - 使用 XSLT 从 XSLT 样式表中删除命名空间声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12465002/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com