2017-01-09 77 views
2

我試圖做XSLT一些運動,這是我第一次XSLT嘗試:使用,每個XSLT的添加XML元素,只有當標籤值爲非空

我有以下XML作爲我的輸入

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <elementA> 
     <elementB attB="valueb"> 
      <elementC attC="c-value"> 
       what I want 
      </elementC> 
     </elementB> 
     <elementB attB="valueb"> 

     </elementB> 
    </elementA> 
</root> 

和下面的XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" 
     indent="yes" /> 
    <xsl:template match="/root/elementA"> 
     <newElement> 
      <xsl:for-each select="elementB[@attB='valueb']"> 
       <valuef> 
        <xsl:for-each select="./elementC"> 
         <xsl:value-of select="."> 
         </xsl:value-of> 
        </xsl:for-each> 
       </valuef> 
      </xsl:for-each> 
     </newElement> 
    </xsl:template> 
</xsl:stylesheet> 

轉換後的XML我得到的是:

<newElement> 
    <valuef> 
      what I want 
    </valuef> 
    <valuef/> 
</newElement> 

我想擺脫空(valuef)標籤(這些都是因爲elementB不是有elementC作爲一個孩子的創建)。

我在哪裏做錯了?

謝謝!

+0

對於您的XML和XSLT片段,我使用http://xsltransform.net/pPJ8LVC得到的結果只是一個空的''元素。因此,請考慮編輯問題並提供一個XML輸入,以獲得您輸出的輸出。 –

+0

完成 - 謝謝並抱歉沒有提供縮進代碼。 – user2522941

回答

0

如果要映射每個elementCvaluef,那麼你可以簡單地使用

<xsl:for-each select="elementB[@attB='valueb']/elementC"> 
     <valuef>     
       <xsl:value-of select="."/> 
     </valuef> 
    </xsl:for-each> 

爲輸入這樣

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <elementA> 
     <elementB attB="valueb"> 
      <elementC attC="c-value"> 
       what I want 
      </elementC> 
     </elementB> 
     <elementB attB="valueb"> 

     </elementB> 
     </elementA> 
</root> 

輸出

<newElement> 
    <valuef> 
       what I want 
      </valuef> 
</newElement> 

看到http://xsltransform.net/pPJ8LVC/1

+0

謝謝,但沒有 - 這與我需要的不同。 另外 - 對於不包括感興趣部分的記錄,您的代碼也會創建冗餘(空)記錄。 – user2522941

+0

我沒有在您的問題中獲得輸入的任何空記錄。 –

相關問題