2012-08-08 134 views
5

我有XMLXSLT刪除不需要的元素

<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
     <inquiryAbout> 
      <code>Code</code> 
      <nameKk>Something</nameKk> 
      <nameRu>Something</nameRu> 
      <documents xsi:nil="true"/> 
     </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

而且我想用XSLT處理它複製所有XML

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:copy-of select="//getInquiryAboutListReturn/inquiryAbouts"/> 
    </xsl:template> 
</xsl:stylesheet> 

我怎麼能複製所有XML沒有<documents xsi:nil="true"/>或不XSI:無= 「真」?

所需的輸出XML

<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
     <inquiryAbout> 
      <code>Code</code> 
      <nameKk>Something</nameKk> 
      <nameRu>Something</nameRu> 
     </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 
+1

您是否只希望省略或者所有帶@xsi:nil =「true」的元素?如果您發佈預期的xml輸出,可能會有所幫助。 – 2012-08-08 17:44:14

+0

我想用@xsi:nil =「true」省略所有元素。 – Eldar 2012-08-08 18:09:09

回答

7

這個簡單的XSLT:

<?xml version="1.0"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    version="1.0"> 

    <xsl:output omit-xml-declaration="no" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <!-- TEMPLATE #2 --> 
    <xsl:template match="*[@xsi:nil = 'true']" /> 

</xsl:stylesheet> 

......當應用到OP的源XML:

<?xml version="1.0"?> 
<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
    <inquiryAbout> 
     <code>Code</code> 
     <nameKk>Something</nameKk> 
     <nameRu>Something</nameRu> 
     <documents xsi:nil="true"/> 
    </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

...產生預期的結果XML:

<?xml version="1.0"?> 
<getInquiryAboutListReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <inquiryAbouts> 
    <inquiryAbout> 
     <code>Code</code> 
     <nameKk>Something</nameKk> 
     <nameRu>Something</nameRu> 
    </inquiryAbout> 
    </inquiryAbouts> 
</getInquiryAboutListReturn> 

說明:

  1. 第一個模板 - 在Identity Template - 副本的所有節點,並從源XML文件的屬性原樣。
  2. 第二個模板匹配所有具有指定名稱空間屬性(等於「true」)的元素,可以有效地刪除這些元素。
+1

他希望所有具有@xsi:nil = true的元素都被省略,而不僅僅是文檔元素。 – 2012-08-08 18:16:08

+1

謝謝@ColinD - 我會更新。 – ABach 2012-08-08 18:17:56

+0

如果你添加了'',這將會刪除所有'xsi:nil '不管真實或虛假的價值 – 2017-11-15 15:42:46