gpt4 book ai didi

xslt - 输入 XML 的动态命名空间

转载 作者:行者123 更新时间:2023-12-02 04:45:34 25 4
gpt4 key购买 nike

我搜索了很多关于动态设置命名空间的帖子,但它们似乎都是指设置输出 XML 的命名空间。

我遇到的问题是输入 XML 的命名空间(在根定义且对所有子节点都相同)不同,并且相同的样式表需要能够处理这两个输入。

例如,一个输入 XML 是:

<root xmlns="aaa">
<body>xxx</body>
</root>

另一个输入 XML 是:

<root xmlns="bbb">
<body>yyy</body>
</root>

在样式表中,我的XPath显然需要使用定义的命名空间,该命名空间是用前缀声明的,即:

xmlns:one="aaa"

但是一旦第二个输入 XML 被转换,它当然就无法工作。

我可以定义另一个 namespace ,例如

xmlns:two="bbb"

但在正确的时间使用该命名空间的唯一方法是复制所有 XSLT 代码,并将其他命名空间作为所有 XPath 的前缀(即使如此,我仍然需要确定使用哪一组 XPath可能很有趣..)

我的样式表当前使用以下 XPath:

%lt;SOMETHING&gt;
<xsl:value-of select="one:body" />
%lt;/SOMETHING&gt;

如您所见,它使用“one”命名空间前缀。有没有办法只获取“body”标签的值,而不管 namespace ?正如下面的评论中提到的,虽然我知道它们是基于命名空间的不同元素,但我知道每个元素中的信息都是相同的,因此我可以这样对待它们。

我看过有关使用 xsl:element 和命名空间属性的帖子,但据我所知,它只定义了输出 XML 的命名空间,而不是输入。 (更糟糕的是,我输出的实际上是转义的 XML,例如 %lt;SOMETHING>,所以我无论如何都无法使用 xsl:element)。

我当前的解决方案(自从发布此内容以来)是在主样式表中包含两个额外的样式表。每一个都特定于命名空间“一”或命名空间“二”,XPath 的每一行都使用相关的命名空间前缀。

我希望有一种方法可以避免两个单独的样式表除了命名空间前缀之外几乎相同。

提前致谢。

最佳答案

如果我的理解是正确的,您希望处理 XML 时忽略元素的 namespace 。实际上,命名空间的意义就是区分不同上下文的元素。所以从 XML 的角度来看,<one:body><two:body> 完全无关,除了他们碰巧有相同的名字这一事实。

如果你无论如何都想这样做,而不是:

<xsl:template match="one:body">
<xsl:template match="two:body">

您应该仅匹配元素的本地名称:

<xsl:template match="*[local-name()='body']">

为了提供更多背景信息:如果你说

<xsl:template match="one:body">

那么这只是一个简短的符号

<xsl:template match="*[namespace-uri()='aaa'][local-name()='body']">

(即“匹配 namespace 为“aaa”且名称为“body”的任何元素”)

因此,通过忽略命名空间来忽略

[namespace-uri()='aaa']

做到了

<xsl:template match="*[local-name()='body']">

相反,你最好说

<xsl:template match="*[namespace-uri()='aaa' or namespace-uri()='bbb'][local-name()='body']">

<xsl:template match="*[namespace-uri()='aaa' or namespace-uri()='bbb' or namespace-uri()='ccc'][local-name()='body']">

等等。 如果,如 dret 所说,您提前知道所有可能的命名空间。

关于xslt - 输入 XML 的动态命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765595/

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