当前位置: 首页 > 知识库问答 >
问题:

XSLT 1.0-提取节点集并作为参数传递

饶明亮
2023-03-14

我得到了这个XML,并且必须从中渲染相当多的内容,并且大多数都工作正常,但我在尝试提取Color的节点集时被踩了一脚,谁的键与bar元素的key匹配,并且属性是硬编码的字符串(在这种情况下是'data')。node-set将作为参数传递给模板,并且每个颜色行只能出现一次:

<report>
    <settings>
        <colors>
            <color key="1-1" name="frame" value="..." ... />
            <color key="1-1" name="data" value="..." ... />
            <color key="2-1" name="frame" value="..." ... />
            <color key="2-1" name="data" value="..." ... />
            <color key="3-1" name="frame" value="..." ... />
            <color key="3-1" name="data" value="..." ... />
        </colors>
        <comp>
             <cont>
                  <bar key="1-1" .../>
                  <bar key="1-1" .../>
                  <bar key="2-1" .../>
             </cont>
        <comp>
        <!-- possibly more <comp/cont/bar> below that may not be mixed with the above -->
     </settings>
</report>

在我的XSLT文件中,我有以下内容(摘录):

<xsl:key name="barnode" match="bar" use="@key"/>
<xsl:key name="colorlookup" match="/report/settings/colors/color" use="@key"/>

<!-- this runs at the `cont` element level, i.e. `bar` can be accessed without prefix -->

<!-- set $x to the node-list of bars with unique @key attribute -->
<xsl:call-template name="renderit">
    <xsl:with-param name="colors">
        <!-- 'bars' contains node-set of 'bar' elements with @key being unique -->
        <xsl:variable name="bars" select="bar[generate-id() = generate-id(key('barnode', @key)[1])]"/>
        <xsl:for-each select="$bars">
            <xsl:value-of select="key('colorlookup', @key)[@name='data']"/>
        </xsl:for-each>
    </xsl:with-param>
</xsl:call-template>

问题是,这不会传递节点集,而是传递树片段。是否可以进行与上述操作相同但返回节点集的选择?

编辑:

预期节点集:

<color key="1-1" name="data" value="..." ... />
<color key="2-1" name="data" value="..." ... />

我不确定所呈现的XSLT是否会生成这个结果树片段,因为我不知道如何打印它(出于调试目的)。

共有1个答案

王才英
2023-03-14

试试吧

<xsl:with-param name="colors" select="key('colorlookup', bar[generate-id() = generate-id(key('barnode', @key)[1])]/@key)[@name = 'data']"/>
 类似资料:
  • 当前输出: 所需的输出是(将提取的内容从CDATA中取出): 我也尝试了“text()”匹配模式,但它不起作用,我阅读了不同的答案并尝试了它们的方法: 我需要使用XSLT1.0。 感谢您的帮助,并向您致意

  • 我得到的错误:java.lang.NoSuchMEDExcture: 这是我的密码

  • 我有一个存储过程,它接受两个输入参数,并给出一个输出参数 输入参数一个是Oracle自定义类型,第二个是字符类型 输出参数是数字类型 有人能帮我访问节点oracle节点模块的过程吗?

  • 我有一个xslt文件,可以使用ApacheFop将xml文件转换为pdf。但是我的xslt中没有关于名称空间的所有信息。它依赖于xml。我可以用java分析xml文档,并从xml中获取所有名称空间。但我不知道如何将这个名称空间从java传递到xslt文件,以及下一步如何在

  • 问题内容: 我正在为我的Java应用程序设计一个简单的数据访问对象。我有一些类(记录),它们代表像和中的表格中的一行。 我想有一种方法来获取特定类型的所有记录。 就目前而言,我是这样的: 但是我想有一个像这样的多态方法(错误): 使用示例: 如何用Java做到这一点? 问题答案: 既然您说不想在不同的类中使用数据访问方法(在Anish的回答中),所以我想为什么不尝试这样的方法。 编辑: 我想再添加

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子: