排除结果前缀不起作用
exclude-result-prefixes not working
我正在尝试编写一个 xslt 转换,它在输出的根元素中不包含任何 @xmlns:* 属性。鉴于此 xml :
<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
<jw:a/>
<b test="1">
<c/>
</b>
</jw:root>
和这个样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0"
xmlns:jw="http://namespace/test/jw" exclude-result-prefixes="jw">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@test"/>
</xsl:stylesheet>
我明白了:
<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
<jw:a/>
<b>
<c/>
</b>
</jw:root>
我试过了
- 将@exclude-result-prefixes 放在根模板上,
- 不复制属性,
- 不在身份模板中使用 'copy' 但使用
- 使用#all
我读过规范,虽然我现在找不到它,但 <xsl:copy/>
忽略了 @exclude-result-prefixes,其他东西也可以覆盖它。
有什么方法可以删除那些@xmlns:[prefix] atts? ns 是在输出使用的 dtd 中定义的,我把它们放在那里搞砸了。猜猜我将不得不制作一个单独的通过 java 打开并以这种方式删除?
谢谢!
exclude-result-prefixes 属性 (a) 仅适用于文字结果元素,并且 (b) 仅消除 未使用的名称空间 - 在元素或属性的名称将始终在结果树中声明。
您想要实现的是将输入元素修改为不同的命名空间。使用 xsl:copy 无法做到这一点,它始终保持元素的名称(名称空间 + 本地名称)不变。您需要使用 <xsl:element name="{local-name()}">
.
创建一个新元素
如果您为结果元素和属性指定了正确的名称,命名空间声明就会自行处理。请记住,元素或属性的名称是 (namespace, localname) 对。
不要使用 身份模板,而是使用以下内容:
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
如果您的来源 XML 也有 带有命名空间的属性 ,
然后添加以下模板:
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
当然,只要您没有 "ovelapping" 元素,这种方法就有效 /
属性名称(具有不同命名空间的相同名称)。
copy-namespaces="no"
使用 xsl:copy-of
对我有用
我正在尝试编写一个 xslt 转换,它在输出的根元素中不包含任何 @xmlns:* 属性。鉴于此 xml :
<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
<jw:a/>
<b test="1">
<c/>
</b>
</jw:root>
和这个样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0"
xmlns:jw="http://namespace/test/jw" exclude-result-prefixes="jw">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@test"/>
</xsl:stylesheet>
我明白了:
<?xml version="1.0" encoding="UTF-8"?>
<jw:root xmlns:jw="http://lexisnexis.com/neptune/gtdttest/jw">
<jw:a/>
<b>
<c/>
</b>
</jw:root>
我试过了 - 将@exclude-result-prefixes 放在根模板上, - 不复制属性, - 不在身份模板中使用 'copy' 但使用 - 使用#all
我读过规范,虽然我现在找不到它,但 <xsl:copy/>
忽略了 @exclude-result-prefixes,其他东西也可以覆盖它。
有什么方法可以删除那些@xmlns:[prefix] atts? ns 是在输出使用的 dtd 中定义的,我把它们放在那里搞砸了。猜猜我将不得不制作一个单独的通过 java 打开并以这种方式删除?
谢谢!
exclude-result-prefixes 属性 (a) 仅适用于文字结果元素,并且 (b) 仅消除 未使用的名称空间 - 在元素或属性的名称将始终在结果树中声明。
您想要实现的是将输入元素修改为不同的命名空间。使用 xsl:copy 无法做到这一点,它始终保持元素的名称(名称空间 + 本地名称)不变。您需要使用 <xsl:element name="{local-name()}">
.
如果您为结果元素和属性指定了正确的名称,命名空间声明就会自行处理。请记住,元素或属性的名称是 (namespace, localname) 对。
不要使用 身份模板,而是使用以下内容:
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
如果您的来源 XML 也有 带有命名空间的属性 , 然后添加以下模板:
<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
当然,只要您没有 "ovelapping" 元素,这种方法就有效 / 属性名称(具有不同命名空间的相同名称)。
copy-namespaces="no"
使用 xsl:copy-of