2014-11-24 39 views
0

我有如下一個requierement不爲空:得到節點和值,如果它使用XSLT

如果我給輸入爲:

<?xml version="1.0"?> 
<new:NewAddressData xmlns:new="http://www.example.org/NewAddress"> 
    <new:NewStreet></new:NewStreet> 
    <new:NewArea>Area_1</new:NewArea> 
    <new:NewState></new:NewState> 
</new:NewAddressData> 

輸出應該是:

<new:NewArea>Area_1</new:NewArea> 

其實蔭新的蜜蜂XSLT,但我讀了一些基本知識,並嘗試以下代碼:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*"/> 
<!-- identity transform --> 
<xsl:template match="@*|node()">   
    <xsl:copy> 
     <xsl:choose> 
      <xsl:when test="@*|node() != ''"> 
     <xsl:value-of select="." disable-output-escaping="yes" /> 
      </xsl:when>       
      <xsl:otherwise> 
       <xsl:apply-templates select="@*|node()"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:copy> 
</xsl:template> 

此我得到的輸出爲:

<new:NewAddressData xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewAddressData> 

其中期望值應該是這樣的:

<new:NewArea>Area_1</new:NewArea> 

所以,我怎麼能做到這一點使用XSLT 1.0

謝謝提前

+4

你在這裏做的是:你放棄了一個要求到這個網站,希望有人會給你的代碼。這不是這個網站的工作原理。請顯示你的努力並解釋你的具體問題。我們不是免費的編程服務。 – Tomalak 2014-11-24 14:54:56

+0

輸入不是標準的XML,它的格式不正確,放置你的XSLT,你試圖得到結果。 – 2014-11-24 15:31:47

+0

嗨@Tomalak感謝您的迴應。如果需要其他信息,請告訴我。 – 2014-11-24 19:36:37

回答

0

看起來您已經閱讀了XSLT標識模板,這很好!

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

就其本身而言,這將跨越不變的所有節點複製(如您的NewArea元素),所以你需要再編寫你想改變的事情模板。在這種情況下,它看起來像要刪除沒有非空文本節點的元素作爲子元素。

<xsl:template match="*[not(text()[normalize-space()])]"> 

試試這個XSLT

<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="*[not(text()[normalize-space()])]"> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 

這將輸出以下

<new:NewArea xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewArea> 

命名空間是必要的在這裏。您不能輸出帶有前綴的元素,也不能聲明與其關聯的名稱空間。

+0

Hi @Tim,感謝您的幫助。代碼按預期工作。 – 2014-11-25 13:26:52

1

你可以這樣做:

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

    <xsl:template match="*[text()]"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 

</xsl:stylesheet> 

根據輸入,如果有多個元素包含文本,這可能會導致輸出格式不正確。

+0

完美的代碼,它也適用於複雜的元素。 – 2014-11-25 09:12:08

+0

嗨@Daniel,謝謝你的幫助。代碼按預期工作。 – 2014-11-25 13:27:52