空节点与值为

时间:2016-07-26 08:07:54

标签: xml xslt

尝试学习XSL,我无法直接理解。 说,我想制作一个XSLT模板,根据它们的值来处理节点。让我们来做一个示例情况:

<data>
  <item1>0</item1>
  <item2></item2>
  <!--Multiple similar nodes below-->
</data>

让我们尝试使用xsi:nil="true"标记空的,而将零值标记为:

<xsl:template match="node()[starts-with(name(), 'item')]">
  <xsl:copy>
    <xsl:if test="not(node()) and not(.!='')"><!--This is the problem-->
      <xsl:attribute name="xsi:nil">true</xsl:attribute>
    </xsl:if>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

这确实完全符合我的要求,但这是一个弗兰肯斯坦的怪物代码,我还没有完全理解。

现在,在进行实验,研究stackoverflow并尝试弄清楚时,我发现not(node())可以定义空值和零值节点,以及.!=0,但.!=''似乎只针对零值节点,这对我没有任何意义 在我看来,字符串值可能被限定为零值,或零值作为空字符串值,但我无法解决它。

基本上,问题是如何区分空节点和零值的节点?

1 个答案:

答案 0 :(得分:0)

  

它确实添加了xsi:nil =&#34; true&#34;到一个空节点,但无论如何   reason删除零的item1值,使其为空。

那是因为你已经下了指令:

<xsl:apply-templates select="@* | node()"/>

xsl:if声明中。

  

基本上,问题是如何区分空节点和?   零值的节点?

空节点没有子节点 - 元素,文本节点或任何其他节点类型(属性除外)。具有零值的节点具有子文本节点,其字符串值为&#34; 0&#34;。要测试空元素,只需执行以下操作:

<xsl:template match="*[starts-with(name(), 'item')][not(node())]">
    <xsl:copy>
      <xsl:attribute name="xsi:nil">true</xsl:attribute>
    </xsl:copy>
</xsl:template>