Skip to main content
 首页 » 编程设计

xslt之xsl:element + xsl:function =怪异 (撒克逊人,Java)

2025年05月04日17sharpest

我已经与这个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属性(可能需要通过以下方式访问)外,这可能是您想要的: