带变量的 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
我怀疑在这个元素中
<data>pi:Summary/pi:Name</data>
内容旨在成为 XPath 表达式,并且您希望对该 XPath 表达式求值。这不是一个正确的期望;使用 xsl:value-of 指令。
我怀疑
<xsl:variable name="dataValues" select="values/value/data"/>
应该是
<xsl:variable name="dataValues" select="$tabsName/entry/values/value/data"/>
尽管我无法解释您所说的输出结果。
- 在此:
<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"/>
我有以下 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
我怀疑在这个元素中
<data>pi:Summary/pi:Name</data>
内容旨在成为 XPath 表达式,并且您希望对该 XPath 表达式求值。这不是一个正确的期望;使用 xsl:value-of 指令。
我怀疑
<xsl:variable name="dataValues" select="values/value/data"/>
应该是
<xsl:variable name="dataValues" select="$tabsName/entry/values/value/data"/>
尽管我无法解释您所说的输出结果。
- 在此:
<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"/>