使用XSLT检查空XML元素

时间:2012-03-20 06:00:33

标签: xml xslt

我有以下XML

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
<Number1>
</Number1>
<Number2>11</Number2>
<Number3>12</Number3>
</ns0:Root>

在这种情况下,我ENTER获得\r\nNumber1。我想编写一些XSLT来检查节点是否包含ENTER\r\n,然后将其替换为<Number1 />

有人可以帮我写这个XSLT吗?

2 个答案:

答案 0 :(得分:10)

对“空元素”的含义有不同的可能定义

让我们将空元素定义为没有任何元素节点子元素且其字符串值为空字符串,或仅包含空格字符('',CR,NL)的元素

然后要检查给定元素是否为空,请使用

not(*) and not(normalize-space())

这假设元素是评估XPath表达式时的上下文节点。

  

在这种情况下,我为Number1获取“ENTER”或“\ r \ n”。我想要   写XSLT以检查节点是否包含“ENTER”或“\ r \ n”然后替换它   

您尚未指定应替换此文本节点的内容,因此在此解决方案中,我假设文本节点应替换为空字符串(已删除):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="*[not(*) and not(normalize-space())]">
  <xsl:element name="{name()}" namespace="{namespace-uri()}"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
    <Number1>
    </Number1>
    <Number2>11</Number2>
    <Number3>12</Number3>
</ns0:Root>

生成了想要的结果

<ns0:Root xmlns:ns0="http://Map_Sample.Input_Schema">
   <Number1/>
   <Number2>11</Number2>
   <Number3>12</Number3>
</ns0:Root>

答案 1 :(得分:0)

尝试以下方法:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="*[normalize-space(string(.)) = '']"/>
</xsl:stylesheet>

说明:跳过(完整后代)文本内容为纯空格的元素的输出。