【问题标题】:How to remove all empty tag with conditons in XSL如何在 XSL 中删除所有带有条件的空标签
【发布时间】:2015-02-07 03:16:02
【问题描述】:

我想删除有异常的空标签。
我制作了一个 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 遵循以下规则时,就不行了。

 <?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 没有被保留,它会删除所有空标签。

有人可以帮助我吗?

【问题讨论】:

  • 我不明白你的问题。为什么要删除空的&lt;cEAN/&gt; 标签not?你说“我创建了一个 XSL 来删除所有空标签,但有例外”。我没有看到那个例外。您的第二个模板删除了 all 空标签 也删除了唯一内容为“-1”的标签。
  • 这显然会删除cEANuCOm。它们没有属性,没有子节点,也没有文本。因此,您的“和”条件中的所有三个条件都为真,并且它将匹配。您可能只需要查看该表达式的逻辑。
  • 我是 XSL 新手,我想删除除 之外的所有空白标签你知道我该怎么做吗?

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


【解决方案1】:

首先,您需要更正您的 XML 以使其有效。我希望,您的意思是 &lt;cEAN/&gt;&lt;/cEAN&gt;,因为我没有看到任何开始标签。 并且xsl:preserve-space 元素中不能有@priority

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

<cEAN> </cEAN>

还有,

<cEAN/>

表示元素cEAN 中有一个空值(没有文本节点,没有子元素)。并且&lt;cEAN/&gt;&lt;cEAN&gt;&lt;/cEAN&gt; 相同。

样式表中的模板:

<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/>

匹配&lt;cEAN/&gt;,因此在输出中被省略,因为模板什么都不做。

要删除除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>

如果您的输入遵循 XML:

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

输出将是:

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

【讨论】:

  • 嗨...首先感谢您的回答。我是 XSL 的新手,我想删除所有空白标签,但标签 除外,你知道我该怎么做吗? ——
猜你喜欢
  • 2011-07-31
  • 2022-09-26
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2015-01-28
  • 2016-08-19
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多