我尝试转换由多个来源生成的一段 XML。如果我将文本直接输入到 value-of select 语句中,它会按预期工作。但是一旦我尝试使用变量,它就不再起作用了。
如果我在 xsl:for-each 语句中使用变量,它也可以正常工作。这是运行良好的 XSL
<xsl:variable name="crm_acc" select="account" />
<xsl:variable name="nav_acc" select="kontakt" />
<xsl:variable name="crm_fname" select="firstname" />
<xsl:variable name="nav_fname" select="fname" />
<TreeView>
<xsl:for-each select="$crm_acc | $nav_acc">
<TreeViewItem Header="Item">
<TreeViewItem Header="Firstname:" >
<xsl:value-of select="firstname | fname" />
</TreeViewItem>
</TreeViewItem>
</xsl:for-each>
</TreeView>
但是,如果我在 xsl:value-of select 中使用变量,它就不会按照下一个代码块中的说明工作。我尝试了很多组合,例如只使用一个带有“firstname”、“firstname | fname”的变量,尝试连接(...)文本等......
<TreeView>
<xsl:for-each select="$crm_acc | $nav_acc">
<TreeViewItem Header="Item">
<TreeViewItem Header="Firstname:" >
<xsl:value-of select="$crm_fname | $nav_fname" />
</TreeViewItem>
</TreeViewItem>
</xsl:for-each>
</TreeView>
输入 XML:
<?xml version='1.0'?>
<root>
<account system="CRM">
<firstname>test1</firstname>
</account>
<account system="CRM">
<firstname>test2</firstname>
</account>
<kontakt system="NAV">
<erstername>nav1</erstername>
</kontakt>
</root>
只有一次我得到结果,因为我在变量中指定了“帐户/名字”。但是这样我总是只在每次迭代中获得第一个元素的值。似乎在指定变量时它失去了上下文(处理器当前位于“帐户”实体内,应该选择“名字作为子节点”)。
我读到 value-of select 语句从 XSLT 1.0 到 2.0 发生了一些变化,但我不完全理解有什么区别(我对 XSLT 很陌生)。
我必须如何指定 XSL 才能使其工作?
更新:代码块 1 中的预期输出
<?xml version="1.0" encoding="UTF-8"?>
<TabItem xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Header="Xaml Accounts Tab">
<TreeView>
<TreeViewItem Header="CRM">
<TreeViewItem Header="Firstname:">test1</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="CRM">
<TreeViewItem Header="Firstname:">test2</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="NAV">
<TreeViewItem Header="Firstname:">nav1</TreeViewItem>
</TreeViewItem>
</TreeView>
</TabItem>
编辑:我应该提到的是这些模板将/可以被修改,因此如果所有“变量”都在一个地方会更容易。可能是目标未命名为“联系人”,而是其他名称,并且在整个文档中对其进行更改容易出错且多余。这些变量也用于由 XmlReader 读取的另一个进程。我尽量减少配置和冗余的麻烦。