Xml

XSLT 刪除不需要的元素

  • November 30, 2012

我有 XML

<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

<documents xsi:nil="true"/>在沒有或沒有 xsi:nil=“true” 的情況下如何複製所有 XML ?

所需的輸出 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>

這個簡單的 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. 第一個模板——身份模板——按原樣從源 XML 文件中複製所有節點和屬性。
  2. 第二個模板匹配所有具有指定命名空間屬性等於“true”的元素,有效地刪除了這些元素。

引用自:https://serverfault.com/questions/453757