Xml 如何重构这个XSLT
我在一个项目中遇到了一个关于som XSLT代码重构的问题。我现在拥有的XSLTXml 如何重构这个XSLT,xml,xslt,refactoring,Xml,Xslt,Refactoring,我在一个项目中遇到了一个关于som XSLT代码重构的问题。我现在拥有的XSLT <pdf:sometext text="{$metadata/namespace:template /namespace:template_collection //namespace:option [namespace:identificator
<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选项因为只有你知道你想说什么,所以只有你能解决它。