我可以通过XSLT强制使用XML属性,具体取决于另一个属性的值吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以通过XSLT强制使用XML属性,具体取决于另一个属性的值吗?相关的知识,希望对你有一定的参考价值。

将帖子

我对xsd / xslt的了解非常有限,如果我的问题非常基础或某种程度上不清楚,请原谅我。我认为我的需要是基本的,但我可能会对这些术语感到困惑,因为我找不到任何相关或接近的答案。

我的.xsd文件中有以下结构:

<xs:element name="someelement">
  ...
  <xs:attribute name="attr1" type="xs:NCName"/>
  ...
  <xs:attribute name="attr2" type="xs:NCName"/>
  ...

我知道在.xsd中我可以设置use =“Required”来强制使用属性。 (强制性我的意思是如果验证失败)

但就我而言,只有“attr2”具有一定值时,“attr1”才是强制性的。

可以这样做吗? (在.xsd文件或.xslt?中)

我希望完成这个行为:

if element is “someelement” and attribute "attr2" equal "somevalue" then set use="Required" for "attr1" else "attr1" should not be mandatory

答案

如果使用标准的xsi:type属性,则必须引用模式中的类型声明,并且它引用的类型声明可以是定义要求的其他属性的默认类型的限制。

如果你想使用像你的混淆命名的xsitype这样的用户定义属性,这对于模式处理器没有特殊意义,那么实现这一点的方法是使用条件类型赋值(又名xs:alternative),这需要一个XSD 1.1处理器。

更新(解决经修订的问题)

你无法在XSD 1.0中实现这一点。它可以在XSD 1.1中使用条件类型赋值(aka xs:alternative)来完成。你定义了两种类型,typeAattr1可选和typeB需要attr1,然后你使用someElement定义xs:alternative的类型,所以当typeA@attr eq 'someValue'否则它有typeB。通常typeB将被定义为typeA的限制。

以上是关于我可以通过XSLT强制使用XML属性,具体取决于另一个属性的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 添加强制节点

与 XSLT 进行区域感知数字比较

使用 xslt 获取位于另一个路径中的另一个 xml 值

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

使用 XSLT 转换在 XML 中创建 xmlns 属性

如何使用 XSLT 复制 XML 以生成相同形式的另一个新 XML