Как переупорядочить элементы узла так, чтобы они соответствовали порядку xsd: sequence? - PullRequest
1 голос
/ 25 января 2012

Есть ли способ переупорядочить элементы в объектах Node так, чтобы они соответствовали порядку xsd:sequence? Я прочитал документы для Node.normalize, но, похоже, не выполняет эту функцию. Есть ли что-то еще, что можно сделать?

Я считаю, что это можно сделать с помощью XSLT, но это будет звучать как слишком сложное решение для использования XSLT и специального java-xlst синтаксического анализатора для выполнения манипуляций, а не наличия чего-то нативного в java.

Или мне действительно нужно было бы написать сложную функцию для выполнения обработки за меня?

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Если я правильно прочитал ваш вопрос, то вам нужен скорее «волшебный» (как в простом) способ перестановки узлов в соответствии с внешним XSD, а не как способ перемещения узлов с использованием некоторого XMLAPI.

Если это правда, то я не знаю ни одного API, который бы предоставлял общий способ достижения такой цели.Это также не тривиальная часть программирования, учитывая сложность моделей контента, которые XSD может описать.

Это также, при очень простых обстоятельствах, практически невозможно решить.Подумайте об этом очень простом примере: представьте модель контента, состоящую из двух вариантов: i) последовательность a - b - c, ii) последовательность b - c - a.Содержимое XML поступает в порядке c - b - a (согласно вашему требованию вы хотите использовать недопустимый XML и сделать его действительным).В этом примере, как правильно это сделать?

Конечно, я не говорю, что это ваш сценарий.Я просто пытаюсь указать, почему, насколько мне известно, никто не придумал решения такой проблемы.

Если ваша модель контента в последовательности довольно тривиальна, что позволяет однозначноспособ ее решения независимо от последовательности, в которую поступает ваш XML, или если контент XML поступает известным, но неправильным образом, все время, тогда вам придется кодировать его, используя предпочтительный подход к манипулированию XML - но я бы предложил, не пытайтесь сделать его родовым, он просто спускается в кроличью нору;) ....

2 голосов
/ 26 января 2012

Если у вас есть только xs: sequence для беспокойства, а не выбор / повторение, и пока схема не написана для использования множества сложных функций, таких как именованные группы моделей и группы подстановки и подстановочные знаки, тогда это не должно Во всяком случае, это будет слишком сложно, если вы используете XSLT 2.0 или XQuery и забудете попытаться закодировать его на Java. Если переменная $ seq является элементом xs: sequence, то ключом сортировки для элемента с именем $ E является «count ($ x / xs: element [(@ name | @ref) = $ E] / previousing-sibling ::» * ", так что вы можете просто вставить это выражение в xsl: sort as

<xsl:for-each select="*">
  <xsl:sort select="count($seq/xs:element[(@name|@ref)=local-name(current())]/preceding-sibling::*"/>
  ...
</xsl:for-each>

Вероятно, нужно немного подыскать пространства имен или другие вещи, с которыми вы можете столкнуться, но вы поняли.

0 голосов
/ 25 января 2012

Вы можете манипулировать XML напрямую в Java, используя следующие пакеты:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;

Вам понадобится поместить синтаксический анализатор XML, например, saxon (см. http://saxon.sourceforge.net/), в ваш путь к классам

Вы можете манипулировать XML «вручную», считывая биты входного документа и создавая требуемый выходной документ, или вы можете написать таблицу стилей xslt и использовать ее для преобразования документа прямо из кода Java.

Попробуйте здесь для начала:

http://oreilly.com/catalog/javaxslt/chapter/ch05.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...