我正在尝试开发一个可以返回节点集或XML片段的XSLT自定义函数,让我们说:
输入文件:
<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>
在第二次出现时匹配 .
Basically what I want to achieve with this custom function is to parse some meta-data present in the comments and use it to generate 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节点集返回给调用模板 .
1 回答
以下可能会让您沿着您想要前往的道路前行 . 请注意,这需要XSLT 2.0版本(在XSLT 1.0中,当为
tokenize
提供替换功能时也是可能的) . 另请注意,这假定了特定的注释内容结构 .说明:注释首先被分成行(分隔符
& #xD;
这是一个换行符),然后在标记值(分隔符":",分成作者,用法,labelC,这里的顺序不重要),然后在属性和值中labelC(分隔符"] ",将属性识别为"["开头) .请注意,使用
normalize-space()
进行了大量的空白擦除 .编辑:带功能的xslt版本见底部
XSLT
当应用于以下XML时
给出以下输出
EDITED 带函数调用的xslt(给出相同的输出)