XSLT удалить ненужные элементы

у меня есть 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

<?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:nil="true"?

Желаемый выходной 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>

person Eazy    schedule 08.08.2012    source источник
comment
Вы хотите, чтобы были опущены только ‹documents xsi:nill=true/› или все элементы с @xsi:nil=true? Может быть полезно, если вы опубликуете ожидаемый вывод xml.   -  person Colin D    schedule 08.08.2012
comment
Я хочу опустить все элементы с @xsi:nil=true.   -  person Eazy    schedule 08.08.2012


Ответы (1)


Этот простой 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>

... при применении к исходному XML OP:

<?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", эффективно удаляет эти элементы.
person ABach    schedule 08.08.2012
comment
Он хочет, чтобы все элементы с @xsi:nil = true были опущены, а не только элементы документа. - person Colin D; 08.08.2012
comment
Если вы добавите <xsl:template match="@xsi:nil" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>, это удалит все xsi:nil независимо от истинного или ложного значения. - person Pankaj Jaju; 15.11.2017