gpt4 book ai didi

xslt - 在 XML 源文件中改变 xpath-default-namespace

转载 作者:行者123 更新时间:2023-12-03 15:48:40 26 4
gpt4 key购买 nike

我有一组用 XSL 转换处理的 XML 文件。它们有一个默认 namespace ,因此我的 XSL 转换必须包含声明:

xpath-default-namespace="urn:CZ-RVV-IS-VaV-XML-NS:data-1.2.2"

问题是这个值不时变化,我的转换突然停止工作,直到我从新文件中查看一个示例,提取这个命名空间 ID 并将其放入转换中,从而转换停止工作旧文件。有没有办法将它作为参数传递,或者在运行时以某种方式设置它?我已经尝试了在各种教程中查找的参数语法,但没有一个适用于此特定用途。

我搜索了各种论坛并找到了对 XSL 的命名空间不可知编码的引用,但不知道如何去做。 Ian Williams 的书“XSLT 和 Xpath”声明必须声明默认命名空间,否则输出流中什么也得不到,这对我来说就是这样。但我真的不想定期手动更改它,我想为用户提供一些有用的东西,而不需要我经常关注。

到目前为止,我发明的唯一 100% 可靠的方法是使用标准编程语言将 XML 源和 XSL 转换都作为文本文件打开,从 XML 源中提取 URI,将其粘贴到 XSL 转换中,关闭这两个文件,然后,最后运行实际的转换。这行得通,但非常笨拙,至少对我来说是这样。如何更好地处理更改默认命名空间?

皮特

最佳答案

xpath-default-namespace 的值必须是静态 URI,因此如果您希望它有所不同,则必须预处理样式表。一种方法是使用 XSLT。每次将以下元样式表应用到您的主样式表,然后改为调用预处理结果。

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- Pass in the new namespace URI as a stylesheet parameter -->
<xsl:param name="new-uri" required="yes"/>

<!-- By default, copy everything as is -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<!-- But update the value of @xpath-default-namespace -->
<xsl:template match="@xpath-default-namespace">
<xsl:attribute name="{name()}" namespace="{namespace-uri()}">
<xsl:value-of select="$new-uri"/>
</xsl:attribute>
</xsl:template>

</xsl:stylesheet>

不过,这是一个有点奇怪的用例,因为 namespace 并不是真正设计为如此动态的。它们旨在限定名称,即构成名称的一部分。当您以这种方式看待它时,动态 namespace 没有多大意义。想象一个数据库,其表名和字段名每隔一段时间就会任意更改,迫使您重写所有 SQL 脚本以跟上更改。这就是它的相似之处。

关于xslt - 在 XML 源文件中改变 xpath-default-namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1862061/

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