【发布时间】:2013-11-21 05:13:10
【问题描述】:
我正在使用 XSLT 2.0 来转换一些 XML。源 XML 类似于:
<AnimalTest>
<AnimalTypes>
<AnimalType name="cat"/>
<AnimalType name="dog"/>
</AnimalTypes>
<Animals>
<Animal name="Sylvester" typeName="cat"/>
<Animal name="Fido" typeName="dog"/>
<Animal name="Tom" typeName="cat"/>
</Animals>
</AnimalTest>
在处理AnimalType 标记的XSL 模板中,我想在XPath 表达式中使用AnimalType 的name 属性。我能够实现这一点的唯一方法是引入一个包含属性@name 并从 XPath 表达式内部引用的变量,如下所示:
<xsl:template match="AnimalType">
<xsl:variable name="typename" select="@name"/>
<xsl:apply-templates select="/AnimalTest/Animals/Animal[@typeName=$typename]"/>
</xsl:template>
这可行,但我想知道我是否真的必须使用这个临时变量。有没有更好的方法来引用 @name 属性?对我来说似乎是绕道而行。
【问题讨论】:
-
如果您使用的是 Saxon 引擎,那么您无需担心执行速度方面的变量 - 如果只有一次调用它就会优化它。我不确定你的问题的答案,除非你已经尝试过
@typeName=./@name -
恕我直言,这些通常用于保存搜索条件的小变量使您的源代码更具可读性。我会赞同@Vadi 的观点,即它们绝对不是性能问题。
-
@Vadi 好的,执行速度不是我首先关心的问题,但在要求一些模糊的“更好的方法”时确实需要考虑。我已经尝试过您建议的解决方案,但它不起作用。
-
@MarcusRickert 我同意 XPath 表达式本身在使用变量时更具可读性。但是,为了准确理解 XPath 表达式,必须在代码中查看更高的代码以查看分配给变量的值是多少有点不方便。