2012-08-08 87 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