2013-02-08 118 views
3

我想要使用xslt轉換給定的XML。 需要注意的是,如果給定的子節點不存在,我將不得不刪除父節點。 我做了一些模板匹配,但我卡住了。任何幫助,將不勝感激。如果子節點不存在於XML中使用xslt刪除父節點

輸入XML:

<Cars> 
     <Car> 
     <Brand>Nisan</Brand> 
     <Price>12</Price> 
    </Car> 
    <Car> 
     <Brand>Lawrence</Brand> 
    </Car> 
    <Car> 
     <Brand>Cinrace</Brand> 
     <Price>14</Price> 
    </Car> 
    </Cars> 

我想刪除不具有內它的價格因素的汽車。 所以預期輸出是:

<Cars> 
     <Car> 
     <Brand>Nisan</Brand> 
     <Price>12</Price> 
    </Car> 
    <Car> 
     <Brand>Cinrace</Brand> 
     <Price>14</Price> 
    </Car> 
    </Cars> 

我嘗試使用這樣的:

<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:output omit-xml-declaration="yes"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
<xsl:template match="Cars/Car[contains(Price)='false']"/> 
</xsl:stylesheet> 

我知道XSLT是完全錯誤的請指點。

UPDATE

更正其中一個工程:)

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <!--Identity template to copy all content by default--> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 


    <xsl:template match="Car[not(Price)]"/> 

</xsl:stylesheet> 
+0

+1對於一個好的XSLT問題的所有3個元素。輸入,輸出,你試過的。 – 2013-02-08 18:42:06

回答

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <!--Identity template to copy all content by default--> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 


    <xsl:template match="Car[not(Price)]"/> 

</xsl:stylesheet> 
+0

什麼是你的身份模板中的car()?你不是指'node()'嗎? – 2013-02-08 18:40:30

+0

這從來沒有奏效,它拋出了語法錯誤@ * | Car()'。'。 – hackmabrain 2013-02-08 18:53:54

+0

身份模板似乎不對。請指教。 – hackmabrain 2013-02-08 18:54:14

1

超近。只要改變你的最後一個模板:

<xsl:template match="Car[not(Price)]"/> 

而且,它不是不正確,但你可以結合你的2個xsl:output元素:

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
+0

_Identity模板似乎不對。請指教,它沒有用._ – hackmabrain 2013-02-08 18:54:52

+0

@hackmabrain咦?我沒有使用身份模板。我只給了你最後一個模板的替代品。 – 2013-02-08 23:29:18

0

不同的解決方案是使用「的xsl:禁止複製'元素。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="xml" /> 

    <xsl:template match="Cars"> 
     <xsl:copy> 
      <xsl:copy-of select="Car[Price]" /> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet>