Предложение зависит от Вашего приложения и Вашей цели.
я записал интеграционные тесты в JUnit, но я также видел, что люди используют HtmlUnit (расширение JUnit), Селен, Watir, Соответствие/Фитнес и даже коммерческие инструменты как WinRunner и Шелк.
Так говорят нам немного больше о Вашем домене и целях Ваших тестов, и можно, вероятно, получить лучший ответ.
Вы также можете добавить директиву вывода в свою таблицу стилей:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Address">
<Address>
<FirstName><xsl:value-of select="name" /></FirstName>
<LastName><xsl:value-of select="lastname" /></LastName>
</Address>
</xsl:template>
</xsl:stylesheet>
Это приведет к тому, что вывод будет иметь начальное объявление xml:
<?xml version="1.0" ?>
Проблема в том, что "/"
является корневым , а не корневым элементом (или "элементом документа") .
Иерархически "/"
находится на один уровень выше элемента документа (
в вашем случае). Итак, это:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Address">
<Address>
<FirstName><xsl:value-of select="name" /></FirstName>
<LastName><xsl:value-of select="lastname" /></LastName>
</Address>
</xsl:template>
</xsl:stylesheet>
действительно будет работать. Обратите внимание на небольшую разницу? Лучше было бы это:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- the identity template (copies your input verbatim) -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- special templates only for things that need them -->
<xsl:template match="name">
<FirstName><xsl:value-of select="." /></FirstName>
</xsl:template>
<xsl:template match="lastname">
<LastName><xsl:value-of select="." /></LastName>
</xsl:template>
</xsl:stylesheet>
Просто чтобы немного расширить и уточнить то, что написал Томалак: корень XML-документа находится в иерархии DOM над элементом верхнего уровня . Исключительно часто можно увидеть, как эти двое путают. Рассмотрим этот XML-документ:
<!-- This is a node - yes, comments are nodes. -->
<root>
<child/>
</root>
<!-- This is also a node. -->
Корень этого документа имеет три дочерних узла: узел комментария, узел элемента и еще один узел комментария. Элемент верхнего уровня называется root
, потому что это то, что делает каждый, кто создает документы экземпляра XML, чтобы сохранить путаницу между корнем документа и элементом верхнего уровня. (Особенно, если они все еще находятся на той стадии своего обучения XML, где они используют «узел», имея в виду «элемент».)
Это подводит нас к одной из причин того, что шаблон, который Томалак описывает как «более приятный». лучше. Если вы расширите преобразование идентичности, единственное, что XSLT изменит в вашем документе, - это элементы, для которых вы создали шаблоны. Все остальные узлы в документе копируются без изменений. Поэтому, если ваш входной документ содержит комментарии вокруг элемента верхнего уровня, как в приведенном выше примере, они не будут удалены из выходных данных, как если бы вы просто реализовали шаблон, соответствующий элементу Address
. .
Конечно, если вы хотите, чтобы ваш вывод исключал комментарии, это тоже легко сделать; просто не выполняйте преобразование идентичности.
Поэтому, если ваш входной документ содержит комментарии вокруг элемента верхнего уровня, как в приведенном выше примере, они не будут удалены из выходных данных, как если бы вы просто реализовали шаблон, соответствующий элементу Address
. .
Конечно, если вы хотите, чтобы вывод не содержал комментариев, это тоже легко сделать; просто не выполняйте преобразование идентичности.
Поэтому, если ваш входной документ содержит комментарии вокруг элемента верхнего уровня, как в приведенном выше примере, они не будут удалены из выходных данных, как если бы вы просто реализовали шаблон, соответствующий элементу Address
. .
Конечно, если вы хотите, чтобы вывод не содержал комментариев, это тоже легко сделать; просто не выполняйте преобразование идентичности.