2015-02-07 97 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