xslt变量类型元素()无法通过xpath向下钻取

时间:2014-06-10 13:42:17

标签: xml xslt xslt-2.0 saxon exslt

我在XSLT 2.0上有一个这个函数和转换构建(请注意下面元素的值实际上是用正确的值填充的,只是不想复制粘贴3其他函数:-)):

<xsl:function name="foo:count_max_nodes_for_each_child_irrelevant_of_level">
    <xsl:param name="root_element"/>
    <xsl:element name="re">
    <xsl:for-each select="$root_element/child::*" >
        <xsl:element name="ch"> <!--{concat('level_1-',position())}-->
            <xsl:attribute name="name">
                <xsl:value-of select="concat('level_1-',position())" />
            </xsl:attribute>
            <xsl:value-of select="max(foo:create_nodes_count_in_levels(foo:count_level_nodes(.,max(./node()[not(node())]/count(ancestor-or-self::node())))))"/>
        </xsl:element>
    </xsl:for-each>
    </xsl:element>
</xsl:function>


<xsl:variable name="this_root" select="." />
<xsl:variable name="max_vertical_nodes_for_each_child_from_root" as="element()" select="foo:count_max_nodes_for_each_child_irrelevant_of_level($this_root)" />

我认为这段代码会生成一个存储在变量中的xml树,我可以进一步向下钻取。 但是当我尝试这个时:

<xsl:variable name="testin_purposes" select="$max_vertical_nodes_for_each_child_from_root/ch[1]" />

没有返回任何值,我几乎尝试了所有东西,甚至exslt:node-set()但没有任何帮助......我可以使用这个变量&#34; max_vertical_nodes_for_each_child_from_root&#34;作为参数发送,并且该参数再次(至少根据Oxygen)具有相同的结构,但即使在另一个函数/转换中我也无法向下钻取...

任何猜测我错过了什么或做错了什么?

感谢您的回答!

1 个答案:

答案 0 :(得分:0)

我希望我能做出贡献:

一个非常简单的问题是:

<xsl:variable name="testin_purposes" select="$max_vertical_nodes_for_each_child_from_root/ch[1]" />

无法选择任何内容,因为您的变量的结构是&#34; re / ch&#34;。

作为一般提示:如果变量不起作用或包含您期望的内容:总是通过

检查其完整内容
<xsl:copy-of select="$variable_name"/>

在你的情况下我得到了

<re><ch name="level_1-1"/></re>

所以(理论上),

<xsl:variable name="testin_purposes" select="$max_vertical_nodes_for_each_child_from_root/rt/ch[1]" />

可以胜任。

但正如Martin Honnen所提到的,通常存在名称空间问题。没有完全理解这个问题(说实话)我个人通过向函数创建的所有元素或者不是为输出设计的时间元素添加名称空间前缀来亲自解决了这个问题。我调用了名称空间前缀&#34; own_t:&#34;并将您的功能更改为

    <xsl:function name="foo:count_max_nodes_for_each_child_irrelevant_of_level">
    <xsl:param name="root_element"/>
    <xsl:element name="own_t:re">
        <xsl:for-each select="$root_element/g7ldb:letter_db/child::*">
            <xsl:element name="own_t:ch">
                <xsl:attribute name="name">
                    <xsl:value-of select="concat('level_1-',position())"/>
                </xsl:attribute>
                <xsl:value-of select="'something_here'"/>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
</xsl:function>

再一次不知道背景,但据我所知,核心变量类型的目的不是&#34;元素&#34;但是&#34;文档节点&#34;。因为(正如你自己所说的那样),你不仅需要一个元素,而是一个洞xml树。

所以,我想

 <xsl:variable name="max_vertical_nodes_for_each_child_from_root" as="document-node()">
            <xsl:document>
                <xsl:copy-of select="foo:count_max_nodes_for_each_child_irrelevant_of_level($this_root)"/>
            </xsl:document>
        </xsl:variable>

将是适当的变量声明。

现在我可以使用

<xsl:value-of select="$max_vertical_nodes_for_each_child_from_root/own_t:re/own_t:ch[1]"/>

并得到: &#34;在这里&#34;。

但要注意:你的函数总是只处理一个元素,即根元素。

如果你的this_root变量看起来像这样

<root><element1>content</element1><element2>content</element2></root>

实际上只有$ this_root的一个孩子,那就是:&#34; root&#34;。