区分现有节点和空节点

时间:2013-08-01 14:47:33

标签: xml xslt

我有2个节点

<example/><example></example>

我如何区分它们?

在我看来,第一个是<xsl:when test="example">,第二个是
<xsl:when test="example = ''">

我不认为这些是正确的 我很困惑。有人可以澄清一下吗?

提前致谢

4 个答案:

答案 0 :(得分:1)

XML信息集和XPath数据模型表明<example/><example></example>之间没有区别:

http://www.w3.org/TR/xml-infoset/#omitted(D.7项)

http://www.w3.org/TR/2007/REC-xpath-datamodel-20070123/#ElementNode(在这里你找不到区分空元素的两种不同语法的属性:如果元素没有使用任何一种语法的子元素,则元素节点的构造方式相同)

答案 1 :(得分:1)

  

我如何区分它们?

您无法在XML工具中区分它们,因为它们是两种不同的方式来序列化完全相同的XML节点树。如果您的应用程序需要来区分两种情况 1 ,那么您将需要使用某种非XML工具,无论是排他性还是作为预处理步骤。

例如,如果您知道原始文件中没有字符串“/>”的实例而不是空元素标记的一部分,那么您可以对原始文件进行文本替换(作为文本处理)以更改

的所有实例
/>

 _wasEmpty="yes"/>
在将结果解析为XML之前,

(包括前导空格),然后您的XSLT可以使用<xsl:when test="example[_wasEmpty = 'yes']">区分。


1 我(以及SO上的许多其他人)会认为声称基于XML但需要区分XML所说的东西的应用程序从根本上被打破 - 这里的正确方法是与设计您正在使用的格式的人交谈,并要求他们更改它以便以XML兼容的方式区分案例,例如使用xsi:nil。但我务实并且欣赏有时候这是不可能的; - )

答案 2 :(得分:1)

它们在设计上难以区分。你也可以写

<example   />

<example  ></example   >

那些也无法区分。

这些变体旨在为人们创作或生成XML提供一些灵活性,而不会使使用XML的应用程序复杂化。

答案 3 :(得分:0)

在我看来 - 两种形式的空元素是相等的,不可能区分它们。

<xsl:when test="example">测试是否存在名为“example”的元素。

<xsl:when test="example = ''">测试元素的字符串值是否为空字符串。