gpt4 book ai didi

xpath - JAXB 绑定(bind)文件 : namespace-aware node selection

转载 作者:行者123 更新时间:2023-12-03 15:50:02 25 4
gpt4 key购买 nike

我倾向于使用外部 JAXB 绑定(bind)文件进行模式到 Java 的编译。这工作得很好,但我确实注意到我开始怀疑的一件事。它并不是真正特定于 JAXB,更像是一个 XPath 问题,但上下文有帮助。

假设我们有这个模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:test="www.acme.com"
targetNamespace="www.acme.com"
elementFormDefault="qualified" attributeFormDefault="unqualified">

<xs:element name="el1"/>

<xs:complexType name="testType">
<xs:sequence>
<xs:element ref="test:el1"/>
</xs:sequence>
</xs:complexType>

</xs:schema>

复杂类型中的元素引用需要前缀“test”,绑定(bind)到我们的目标命名空间,以查找元素定义。如果我们省略前缀,模式处理器会提示找不到它引用的元素。很明显,引用是一个限定名称,模式处理器知道这一点。

现在为 XJC 提取以下绑定(bind)文件提取:

<bindings node="//xs:complexType[@name='testType']">
<bindings node=".//xs:element[@ref='test:el1']">
<property name="element1"/>
</bindings>
</bindings>

复杂类型的绑定(bind)很清楚。我们按名称选择它,xs 前缀绑定(bind)在绑定(bind)文件的根目录中(此处未显示)。它也可能是 xsd
让我烦恼的是嵌套绑定(bind)。在我们的复杂类型节点的上下文中,我们选择一个 xs:element 节点,其属性 ref 的值为 test:el1。但该值仅被视为文本。 XML 处理器不知道它应该是一个限定名称,而 test: 实际上是一个绑定(bind)到命名空间的前缀声明。

现在我知道我在挑剔,但实际的前缀字符串应该不重要,只有 namespace URI 本身。有人可以将模式中的 test 前缀更改为 acme 并且它在语义上仍然是相同的模式。但是,我的绑定(bind)文件将不再有效。

那么,有没有什么方法可以在不依赖前缀知识而仅依赖命名空间 URI 的情况下构造 XPath 表达式?这显然不是什么大问题,但我对此很好奇。

最佳答案

Is there any way to construct the XPath expression without relying on knowledge of the prefix, only the namespace URI?

如果你谈论属性值,这就是 XPath 1.0

.//xs:element[
namespace::*[
. = 'www.acme.com'
][
susbtring-before(
../@ref,
':'
)
= name()
]
and
substring(
concat(':', @ref),
string-length(@ref) - 1
)
= 'el1'
]

在 XPath 2.0 中要简单得多:

.//xs:element[resolve-QName(@ref,.) eq QName('www.acme.com','el1')]

关于xpath - JAXB 绑定(bind)文件 : namespace-aware node selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5634416/

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