Я пытаюсь разработать пользовательскую функцию XSLT, которая может возвращать набор узлов или фрагмент XML, скажем, что-то вроде:
Входной документ:
<root>
<!--
author: blablabla
usage: more blablabla
labelC: [in=2] <b>formatted</b> blablabla
-->
<tag1 name="first">
<tag2>content a</tag2>
<tag2>content b</tag2>
<tag3 attrib="val">content c</tag3>
</tag1>
<!--
author: blebleble
usage: more blebleble
labelC: blebleble
-->
<tag1 name="second">
<tag2>content x</tag2>
<tag2>content y</tag2>
<tag3 attrib="val">content z</tag3>
</tag1>
</root>
Так что шаблон XSLTнапример:
<xsl:template match="//tag1/preceding::comment()[1]" xmlns:d="java:com.dummy.func">
<section>
<para>
<xsl:value-of select="d:genDoc(.)"/>
</para>
</section>
</xsl:template>
Будет выдано:
<section>
<para>
<author>blablabla</author>
<usage>more blablabla</usage>
<labelC in="2"><b>formatted</b> blablabla</labelC>
</para>
</section>
При сопоставлении при первом появлении tag1 и
<section>
<para>
<author>blebleble</author>
<usage>more blebleble</usage>
<labelC>blebleble</labelC>
</para>
</section>
При сопоставлении при втором появлении.
По сути, я хочу достичь этой пользовательской функции, чтобы проанализировать некоторые метаданные, присутствующие в комментариях, и использовать их для генерации XML.
Я нашел несколько примеров в Интернете, один в: http://cafeconleche.org/books/xmljava/chapters/ch17s03.html
В соответствии с примером, моя функция должна возвращать одно из следующих значений:
org.w3c.dom.traversal.NodeIterator,
org.apache.xml.dtm.DTM,
org.apache.xml.dtm.DTMAxisIterator,
org.apache.xml.dtm.DTMIterator,
org.w3c.dom.Node and its subtypes (Element, Attr, etc),
org.w3c.dom.DocumentFragment
Мне удалось реализовать функцию, возвращающую XML как простой тип String.Это, однако, создает несколько других проблем: главная из них заключается в том, что символы маркеров экранируются при вставке в исходный XML.
У кого-нибудь есть пример того, как реализовать такую функцию?В основном меня интересует, как вернуть правильный узел XML в вызывающий шаблон.