0

我在 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() 但没有任何帮助...我可以将此变量“max_vertical_nodes_for_each_child_from_root”作为参数发送,并且该参数再次(至少根据氧气)相同结构,但即使在另一个功能/转换中,我也无法深入研究......

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

感谢您的任何回答!

4

1 回答 1

0

我希望我能贡献一些东西:

一个很简单的问题是:

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

不能选择任何东西,因为你的变量的结构是“re/ch”。

作为一般提示:如果变量不起作用或包含您期望的内容:始终通过以下方式检查其完整内容

<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 所提到的,通常存在命名空间问题。在没有完全理解这个问题(老实说)的情况下,我个人通过向所有由函数创建的元素或不是为输出设计的时间元素添加命名空间前缀来解决这个问题。我将该名称空间前缀称为“own_t:”并将您的函数更改为

    <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>

再次没有真正了解背景,但据我了解,用于您目的的正确变量类型不是“元素”而是“文档节点”。因为(正如您自己所说的那样)您不希望只有一个元素,而是希望有一个洞 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]"/>

并得到:“这里的东西”。

但请注意:您的函数将始终只处理一个元素,即根元素。

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

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

实际上只有一个 $this_root 的孩子,那就是:“root”。

于 2014-06-11T07:35:03.910 回答