尝试学习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
,但.!=''
似乎只针对零值节点,这对我没有任何意义
在我看来,字符串值可能被限定为零值,或零值作为空字符串值,但我无法解决它。
基本上,问题是如何区分空节点和零值的节点?
答案 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>