Xml 如何重构这个XSLT

Xml 如何重构这个XSLT,xml,xslt,refactoring,Xml,Xslt,Refactoring,我在一个项目中遇到了一个关于som XSLT代码重构的问题。我现在拥有的XSLT <pdf:sometext text="{$metadata/namespace:template /namespace:template_collection //namespace:option [namespace:identificator

我在一个项目中遇到了一个关于som XSLT代码重构的问题。我现在拥有的XSLT

<pdf:sometext text="{$metadata/namespace:template 
                     /namespace:template_collection
                     //namespace:option
                     [namespace:identificator 
                      = $report_option_identifier]
                     /namespace:name}"/>

问题是XSLT需要扩展以命中更多节点(origianl XML的新版本,名称空间略有更改,标记略有更改)

我想出了这个密码:

<xsl:variable name="report_template_collection" 
              select="$metadata
                      /namespace:template
                      /namespace:template_collection 
                      | 
                      $metadata
                      /namespace2:templateV2
                      /namespace2:template_collectionV2" />
<xsl:variable name="current_report_option" 
              select="namespace:option | namespace2:optionV2" />
<xsl:variable name="incomplete_report_option_text" 
              select="$report_template_collection
                      //$current_report_option
                      [namespace:identificator 
                      = $report_option_identifier]
                      /namespace:name"/>

<pdf:sometext text="{$incomplete_report_option_text}"/>

但编译时会出现以下错误:

表达式中出现意外标记“$”。

$report\u template\u collection/-->$在xpath表达式中执行的操作中,不能引用
$current\u report\u选项。不能使用诸如宏之类的XSLT变量,这似乎是您正在尝试的。
$current\u report\u选项的类型是节点集

如果我正确解释了您试图(错误地)使用当前报告选项的意图,您应该执行以下操作:

<xsl:variable name="incomplete_report_option_text" 
              select="$report_template_collection
                      //*[self::namespace:option or
                          self::namespace2:optionV2]
                      [namespace:identificator 
                      = $report_option_identifier]
                      /namespace:name"/>


我将您对
$current\u report\u option
的使用替换为用于检查旧的或新的选项节点类型的节点测试。

形式为
a/B/$C
的XPath表达式在XPath 2.0中实际上是合法的,但在XPath 1.0中不合法。但这可能并不意味着你认为它意味着什么。像@ewh一样,我怀疑(没有任何证据)您正在想象,如果变量
$C
绑定到表达式
D | E
,那么
A/B/$C
是另一种书写
A/B/(D | E)
的方式。事实并非如此
$C
绑定到一个值(节点序列),而不是表达式

您可以使用函数而不是变量:

<xsl:function name="f:current_report_option">
  <xsl:param name="node" as="node()"/>
  <xsl:sequence select="$node/(D|E)"/>
</xsl:function>

<xsl:variable name="X" select="A/B/f:current_report_option(.)"/>


你的问题像现在这样无法回答。所有这些变量的目的是什么?您提到了XML输入的不同版本,但没有显示任何版本。我建议您编辑您的问题,并按以下顺序显示:1句话解释您的目标是什么,出了什么问题,一个完整的、最小的XSLT样式表以及您当前的问题,XML输入-以及您期望的XML输出。错误消息告诉您,
select
属性之一的值不是XPath表达式。你的问题在表达式的阅读部分<代码>/$current\u report\u选项因为只有你知道你想说什么,所以只有你能解决它。