Удаление элементов из документа XML, XSLT и JAXB - PullRequest
4 голосов
/ 03 марта 2011

Этот вопрос является продолжением моего предыдущего вопроса: Создание действительного XSD, открытого с использованием и элементов

Учитывая, что у меня есть строка Java, содержащаяXML-документ следующей формы:

<TRADE>
  <TIME>12:12</TIME>
  <MJELLO>12345</MJELLO>
  <OPTIONAL>12:12</OPTIONAL>
  <DATE>25-10-2011</DATE>
  <HELLO>hello should be ignored</HELLO>
</TRADE>

Как я могу использовать XSLT или аналогичный (в Java с использованием JAXB), чтобы удалить все элементы, не содержащиеся в наборе элементов.В приведенном выше примере меня интересуют только (ВРЕМЯ, ДОПОЛНИТЕЛЬНО, ДАТА), поэтому я хотел бы преобразовать его в:

<TRADE>
  <TIME>12:12</TIME>
  <OPTIONAL>12:12</OPTIONAL>
  <DATE>25-10-2011</DATE>
</TRADE>

Порядок элементов не фиксирован.

Ответы [ 3 ]

6 голосов
/ 03 марта 2011

Это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNames" select="'|TIME|OPTIONAL|DATE|'"/>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*/*">
  <xsl:if test="contains($pNames, concat('|', name(), '|'))">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML:

<TRADE>
    <TIME>12:12</TIME>
    <MJELLO>12345</MJELLO>
    <OPTIONAL>12:12</OPTIONAL>
    <DATE>25-10-2011</DATE>
    <HELLO>hello should be ignored</HELLO>
</TRADE>

создает искомый, правильный результат:

<TRADE>
   <TIME>12:12</TIME>
   <OPTIONAL>12:12</OPTIONAL>
   <DATE>25-10-2011</DATE>
</TRADE>

Объяснение :

  1. Правило идентификации (шаблон) копирует каждый узел"как есть".

  2. Правило идентификации переопределяется шаблоном, соответствующим любому элементу, который не является верхним элементом документа.Внутри шаблона выполняется проверка, если имя совпадающего элемента является одним из имен, указанных во внешнем параметре $pNames в строке разыскиваемых имен с разделителями в виде трубы.

  3. См. Документацию вашего процессора XSLT о том, как передать параметр в преобразование - это зависит от реализации и отличается от процессора к процессору.

1 голос
/ 03 марта 2011

JAXB & XSLT

JAXB очень аккуратно интегрируется с XSLT для примера, см.

Ваш другой вопрос

Исходя из вашего предыдущего вопроса (см. ссылку ниже), преобразование действительно не нужно, поскольку JAXB будет просто игнорировать атрибутыи элементы, которые не сопоставлены с полями / свойствами в вашем доменном объекте.

1 голос
/ 03 марта 2011

Я еще не пробовал, но, возможно, поможет пакет javax.xml.tranform:

http://download.oracle.com/javase/6/docs/api/javax/xml/transform/package-summary.html

...