我已经与这个XSL(Saxon / Java)代码进行了几个小时的战斗,但仍然无法理解。我将问题缩小到以下代码段:
<xsl:function name="my:fff" >
<xsl:element name="p0">
<p1 aaa='AAA' />
</xsl:element>
</xsl:function>
<xsl:function name="my:ggg">
<xsl:variable name="v" select="my:fff()" />
<!-- Debug messages -->
<xsl:message>
$v '<xsl:sequence select="$v" />'
$v/* '<xsl:sequence select="$v/*" />'
$v/*/@aaa '<xsl:value-of select="$v/*/@aaa" />'
$v/p0 '<xsl:sequence select="$v/p0" />'
</xsl:message>
...
</xsl:function>
my:ggg
中打印的输出如下:
$v '<p0><p1 aaa="AAA"/></p0>'
$v/* '<p1 aaa="AAA"/>'
$v/*/@aaa 'AAA'
$v/p0 ''
前三行很好。但是输出空字符串的第四行很奇怪。我的意思是,如果
$v
是
<p0><p1 aaa="AAA"/></po>
(如第一行所示),那么为什么
$v/p0
不是
<p1 aaa="AAA"/>
呢?
我想念什么?
请您参考如下方法:
如果my:fff()
函数返回文档节点-而不是元素(本身没有p0
子元素的p0
),则您的推理就可以了。
因此,如果将函数更改为以下内容:
<xsl:function name="my:fff" as="document-node()" >
<xsl:document>
<xsl:element name="p0">
<p1 aaa='AAA' />
</xsl:element>
</xsl:document>
</xsl:function>
完整的转换将是:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:sequence select="my:ggg()"/>
</xsl:template>
<xsl:function name="my:fff" as="document-node()" >
<xsl:document>
<xsl:element name="p0">
<p1 aaa='AAA' />
</xsl:element>
</xsl:document>
</xsl:function>
<xsl:function name="my:ggg">
<xsl:variable name="v" select="my:fff()" />
<!-- Debug messages -->
<xsl:message>
$v '
<xsl:sequence select="$v" />
' $v/* '
<xsl:sequence select="$v/*" />
' $v/*/@aaa '
<xsl:value-of select="$v/*/@aaa" />
' $v/p0 '
<xsl:sequence select="$v/p0" />'
</xsl:message> ...
</xsl:function>
</xsl:stylesheet>
然后将此转换应用于任何XML文档(未使用),现在将产生以下调试输出:
$v '<p0><p1 xmlns:my="my:my" aaa="AAA"/></p0>'
$v/* '<p0><p1 xmlns:my="my:my" aaa="AAA"/></p0>'
$v/*/@aaa ''
$v/p0 '<p0><p1 xmlns:my="my:my" aaa="AAA"/></p0>'
除了
aaa
属性(可能需要通过以下方式访问)外,这可能是您想要的: