带变量的 xsl 应用模板(调用模板)并在 xsl:evaluate 中使用

xstl apply-template (call tempalate) with variable and use in xsl:evaluate

我有以下 xml:

<pi:Payroll_Extract_Employees xmlns:pi="urn:com.workday/picof">
   <pi:company>
      <pi:Employee>
         <pi:name>John Andrews</pi:name>
         <pi:age>23</pi:age>
         <pi:salary>4000</pi:salary>
         <pi:division>Accounting</pi:division>
      </pi:Employee>
   </pi:company>
</pi:Payroll_Extract_Employees>

我正在使用这个转换:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pi="urn:com.workday/picof">
    <xsl:output method="text"/>
    <xsl:template match="pi:Payroll_Extract_Employees/pi:company">
        <xsl:variable name="tabsNames">
            <entry>
                <spreadSheetName>Payroll Data for Taiwan</spreadSheetName>
                <values>
                    <value>
                        <header>Chinese Name</header>
                        <data>/pi:Name</data>
                    </value>
                </values>
            </entry>
        </xsl:variable>
        <xsl:variable name="currentNode" select="."/>
        <xsl:for-each select="$tabsNames/entry">
            <xsl:variable name="dataValues" select="values/value/data"/>

            <xsl:call-template name="employeeRows">
                <xsl:with-param name="rows" select="$dataValues" as="element()*"/>
                <xsl:with-param name="currentNode" select="$currentNode" as="element()"/>
            </xsl:call-template>

        </xsl:for-each>
    </xsl:template>
    <xsl:template name="employeeRows">
        <xsl:param name="rows" select="."/>
        <xsl:param name="currentNode" select="."/>

        <xsl:for-each select="$currentNode/pi:Employee">
            <xsl:variable name="employee" select="." as="element()"/>
            <xsl:for-each select="$rows">
                <xsl:variable name="path" select="."/>
                <xsl:value-of>
                    <xsl:evaluate xpath="$employee || $path" context-item="."/>
                    <!--<xsl:value-of select="$employee/pi:name"/>-->
                </xsl:value-of>
            </xsl:for-each>
        </xsl:for-each>

    </xsl:template>
</xsl:stylesheet>

我在这里创建了一个地图 $tabNames 并且想将地图与当前节点一起传递给 employeeRows 模板。我得到的不是 "rows" 参数的数据值,而是整个地图,而不是 currentNode 参数的当前节点 (pi:Payroll_Extract_Employees/pi:company),我收到与 "rows" 参数相同的地图。 第二个问题是 xsl:evaluates 将 $employee 更改为我想要遵循的值以给我相同的输出

<xsl:evaluate xpath="$employee || $path" context-item="."/>

这样

<xsl:value-of select="$employee/pi:Name"/>

到目前为止,我在这里抛出一个错误:

<xsl:evaluate xpath="$employee || $path" context-item="."/>

错误信息:

系统 ID:C:\Users\przemekb\AppData\Local\Temp\Untitled4.xsl 严重性:致命 说明:提供给 xsl:evaluate 的 XPath 表达式中存在静态错误:超出表达式末尾的意外标记名称 "Andrews"。表达式:{ John Andrews 23 4000 Accounting pi:Name} 开始位置:36:42 长度:1

  1. 我怀疑在这个元素中

    <data>pi:Summary/pi:Name</data>

内容旨在成为 XPath 表达式,并且您希望对该 XPath 表达式求值。这不是一个正确的期望;使用 xsl:value-of 指令。

  1. 我怀疑

    <xsl:variable name="dataValues" select="values/value/data"/>

应该是

<xsl:variable name="dataValues" select="$tabsName/entry/values/value/data"/>

尽管我无法解释您所说的输出结果。

  1. 在此:

<xsl:with-param name="currentNode" select="." as="node()*"/>

有些不对劲,因为“。”将始终是单例,那么为什么 "as" 属性表明它可能是一个序列?

也许你的

<xsl:evaluate xpath="$employee || $path" context-item="."/>

应该是

<xsl:evaluate xpath="'$employee' || $path">
  <xsl:with-param name="employee" select="$employee"/>
</xsl:evaluate>

或者干脆

<xsl:evaluate xpath="$path" context-item="$employee"/>