gpt4 book ai didi

xml - 将 XSLT 输入文档前缀映射到首选值

转载 作者:行者123 更新时间:2023-12-04 16:51:07 35 4
gpt4 key购买 nike

使用 XSLT,我想知道如何让输出使用我的样式表的命名空间前缀而不是输入文档的前缀。举例来说,鉴于这个非常简化的文档:

<?xml version="1.0"?>
<a:node xmlns:a="urn:schemas:blah:"/>

以及以下 XSL 转换:
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:blah="urn:schemas:blah:" version="2.0">
<xsl:output indent="yes">
<xsl:template match="/blah:node">
<xsl:copy/><!-- marked -->
</xsl:template>
</xsl:transform>

我可以说处理器(如果重要的话,Saxon8)可以识别前缀“blah:”和“a:”的等效性,但是 fn:in-scope-prefixes()例如不显示“blah”,只显示“a”。更改 <!-- marked -->上面的行到:
<node><xsl:value-of select="in-scope-prefixes(.)"/></node>

输出:
<?xml version="1.0" encoding="UTF-8"?>
<node xmlns:blah="urn:schemas:blah:">xml a</node>

如何在不事先知道输入文件调用该前缀“a”的情况下将输入前缀“a”映射到“blah”? (所以 <xsl:namespace-alias/> 对我不起作用。)

作为进一步的上下文,如果它指向更好的解决方案,那就是查看外部生成的 XML 文档。外部进程使用自动生成的前缀“a:”、“b:”、“c:”等创建输入文档。我希望能够使用“更友好”的命名空间前缀来显示这些前缀。

更新:in-scope-prefixes() 行为由 the definition of Statically known namespaces 解释

最佳答案

本次改造 ( XSLT 1.0 和 XSLT 2.0 (只需更改 version 属性)):

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<my:namespaces>
<ns prefix="blah" uri="urn:schemas:blah:"/>
<ns prefix="foo" uri="uff:anotherNamespace"/>
</my:namespaces>

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<xsl:template match=
"*[namespace-uri()=document('')/*/my:namespaces/*/@uri]">
<xsl:variable name="vNS" select=
"document('')/*/my:namespaces/*
[@uri=namespace-uri(current())]"/>
<xsl:element name="{$vNS/@prefix}:{local-name()}"
namespace="{namespace-uri()}">
<xsl:copy-of select=
"namespace::*[not(. = namespace-uri(current()))]"/>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

复制任何 XML 文档,并仅用我们指定的前缀替换此文档用于选择命名空间的前缀。

应用于此 XML 文档时 :
<t>
<a:node xmlns:a="urn:schemas:blah:"/>
<b:node xmlns:b="urn:schemas:blah:"/>
<c:node xmlns:c="uff:anotherNamespace"/>
</t>

产生了想要的结果 :
<t>
<blah:node xmlns:blah="urn:schemas:blah:"/>
<blah:node xmlns:blah="urn:schemas:blah:"/>
<foo:node xmlns:foo="uff:anotherNamespace"/>
</t>

关于xml - 将 XSLT 输入文档前缀映射到首选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303935/

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