2015-02-07 95 views
0

我想删除具有例外的空标记。
我做了一个XSL以除去所有空标签,但有例外。按照下面的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> 

标签切安不保留,它是删除所有空标签。

有人可以帮助我吗?

+0

我不明白你的问题。为什么应该将空的''标签**删除?你说“*我制作了一个XSL来删除所有空标签,但是例外*”。我没有看到这种例外。您的第二个模板将删除**全部**空标签**和**其他唯一内容为“-1”的标签。 – 2015-02-07 04:22:07

+0

这显然是要删除'cEAN'和'uCOm'。他们没有属性,没有子节点,也没有文字。因此你和'条件中的所有三个条件都是真实的,并且它们会匹配。您可能只需要查看该表达式的逻辑。 – Flynn1179 2015-02-07 14:43:49

+0

我是XSL新手,我想删除除之外的所有空白标签你知道我该怎么做? – 2015-02-09 09:26:06

回答

0

首先,你需要纠正你的XML是有效的。我希望,你的意思是<cEAN/></cEAN>,因为我没有看到任何开始标签。 并且在xsl:preserve-space元素中不可以有@priority

如果我的假设是正确的,那是预期的行为。 像下面这样的元素意味着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> 

如果您输入以下XML:

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

输出将是:

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

嗨...首先感谢您的回答。 \t 我是新来的XSL,我想删除所有空白标签,但有一个例外标签你知道我该怎么做? - – 2015-02-09 09:26:59

+0

@EduardoOliveira,请参阅我编辑的答案。 – 2015-02-09 10:27:36

+0

这是有用的。非常感谢, – 2015-02-09 20:14:36