2011-11-13 67 views
1

我一直在爭取這個XSL(Saxon/Java)代碼幾個小時,現在仍然無法確定。我變窄問題降低到這個片段:xsl:element + xsl:function = weirdness? (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"/>

我錯過了什麼?

+2

'$ v'是'my:fff'返回的元素,所以它*是* '包含子元素的標籤。 '$ v/p0'試圖選擇一個''作爲'$ v'中的標籤的子元素,因爲'$ v'選擇的標籤''不包含'',所以它是空的。 – rsp

+0

@rsp - 你應該讓這個答案,因爲它*是答案。 –

+0

@唐,確定完成:) – rsp

回答

1

如果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屬性,它需要的例外,因爲要訪問:$v/*/*/@aaa

1

$vmy:fff返回的元素,所以它標籤<p0>包括兒童。 $v/p0嘗試選擇<p0>作爲$v中標記的子項,該標記爲空,因爲由$v選擇的標記<p0>不包含<p0>

1

你會發現很容易診斷這類問題,如果你做的還是宣告說法習慣並返回一個函數的類型。這會迫使你考慮我的:fff回報。在這種情況下,它是一個(無父母)元素節點:您可以聲明結果爲as="element(p0)"。然後它會更清楚地表明p0元素不可能有任何p0子元素,因此my:fff()/p0可能是錯誤的。

相關問題