xstl apply-template(call tempalate)with variable并在xsl:evaluate中使用

时间:2017-11-13 10:59:34

标签: variables xslt xls xslt-3.0

我有以下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>

这里我创建了一个map $ tabNames,并希望将map与当前节点一起传递给employeeRows模板。而不是“行”参数的数据值,我获得整个地图而不是当前节点(pi:Payroll_Extloy_Employees / pi:company)的currentNode参数,我收到与“rows”参数相同的地图。 第二个问题是xsl:评估将$ 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

2 个答案:

答案 0 :(得分:0)

  1. 我怀疑在这个元素中

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

  2. 内容旨在成为XPath表达式,并且您希望评估此XPath表达式。这不是一个正确的期望;使用xsl:value-of instruction。

    1. 我怀疑

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

    2. 应该是

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

      虽然我不能说明你说的输出。

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

        有些不对劲,因为&#34;。&#34;将永远是一个单身人士,为什么&#34; as&#34;属性表明它可能是一个序列?

答案 1 :(得分:0)

也许是你的

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