2017-02-21 60 views
0

我幾乎是一個XML的新手,如果它沒有填充元素,我需要一些幫助來創建XSLT模板以不顯示元素:用於刪除元素(如果它不包含特定子元素)的XSLT模板

我會盡力來形容我的意思是下面一些例子輸入和期望的輸出:

輸入:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS2978</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
    <item> 
     <ID>12345</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
    </item> 
</shop> 

所需的輸出:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS29783</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
</shop> 

所以,基本上,如果未填充<info>元素,那麼就應該隱藏整個<item>元素。

我希望有人在那裏願意告訴我們如何才能做到這一點。由於

+0

您的輸入不是格式良好的XML:它缺少一個根元素,並且「」和「」(XML區分大小寫)之間不匹配。還要注意,在你的例子中'info'是*元素*,而不是*屬性*。 –

+1

執行此操作的一種方法是使用* identity transform *模板,以及匹配'item [not(info)]'的空模板。 –

+0

隨着我的編輯,我更改了兩個元素名稱:'Item'到'item'和'authcodeE'到'authcode'以使XML格式良好。考慮一下。 – zx485

回答

1

這個簡單的XSLT的1.0模板應該這樣做:

<?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="*" /> 

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

    <!-- This template does remove the 'item' elements which do not have 'info' children --> 
    <xsl:template match="item[not(info)]" /> 

</xsl:stylesheet> 

這XSLT簡單應用identity template對所有節點忽略其不具有info孩子們都item節點。
<xsl:strip-space...刪除被忽略元素的空白區域。

+0

Zx485。非常感謝!你爲我節省了相當一段時間。 – alex

+1

@alex:很高興能讀到:-)你可以通過接受這個答案來強調你的讚賞。 – zx485

相關問題