如何在XSL中删除所有带有条件的空标记

时间:2015-02-07 03:16:02

标签: xml xslt tags conditional-statements xml-namespaces

我想删除空标签,例外 我创建了一个XSL来删除所有空标记异常。遵循以下XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:strip-space elements="*"/>
 <xsl:preserve-space elements="cEAN"/ priority="1">
 <xsl:template match="node()|@*">
   <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/>
</xsl:stylesheet>

当遵循以下规则的XML时,它工作正常,

<?xml version="1.0" encoding="utf-8"?>
  <NFe xmlns:n0="http://mynamespace">
     <cProd>0000000000001</cProd>
     <cEAN> </cEAN>
     <xProd>ARV NAT</xProd>
     <NCM>01000</NCM>
     <CFOP>9999</CFOP>
     </uCom>
 </Nfe>

转换XML:

<?xml version="1.0" encoding="UTF-8"?>
<NFe xmlns:n0="http://mynamespace">
  <cProd>0000000000001</cProd>
  <cEAN />
  <xProd>ARV NAT</xProd>
  <NCM>01000</NCM>
  <CFOP>9999</CFOP>
</NFe> 

但是当遵循以下规则的XML时,Isn才能工作。

 <?xml version="1.0" encoding="utf-8"?>
  <NFe xmlns:n0="http://mynamespace">
     <cProd>0000000000001</cProd>
     <cEAN/>
     <xProd>ARV NAT</xProd>
     <NCM>01000</NCM>
     <CFOP>999</CFOP>
     <uCom/>
  </Nfe>

转换XML:

<?xml version="1.0" encoding="UTF-8"?>
<NFe xmlns:n0="http://mynamespace">
   <cProd>0000000000001</cProd>
   <xProd>ARV NAT</xProd>
   <NCM>01000</NCM>
   <CFOP>9999</CFOP>
</NFe>

标签cEAN不会被保留,并且会删除所有空标签。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

首先,您需要更正XML才有效。我希望,<cEAN/> </cEAN>@priority,因为我没有看到任何开始标记。 xsl:preserve-space元素中没有cEAN

如果我的假设是正确的,那就是预期的行为。 像下面这样的元素意味着有一个文本节点,其值为空格(<cEAN> </cEAN> )。

<cEAN/>

cEAN

表示元素<cEAN/>中包含空值(没有文本节点,没有子元素)。 <cEAN></cEAN><xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/> 相同。

样式表中的模板:

<cEAN/>

匹配cEAN,因此在输出中省略,因为模板不执行任何操作。

要删除除<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="*[. = '' and not(self::cEAN)]"/> </xsl:stylesheet> 元素之外的所有空元素,可以使用以下样式表:

<NFe>
    <cEAN/>
    <CFOP>9999</CFOP>
    <empty/>
</NFe>

如果您的输入符合XML:

<?xml version="1.0" encoding="utf-8"?>
<NFe>
   <cEAN/>
   <CFOP>9999</CFOP>
</NFe>

输出结果为:

{{1}}