如何在XSLT中分解大型XPath?

时间:2017-11-09 15:22:02

标签: xml xslt xpath

我在XSLT中编写了一些产品导出,并且我有一些相当大的select语句,因为我有这些嵌套的排序/标题

给出一个select语句,例如......

{{1}}

是否可以将语句的各个部分分解为可在运行时评估的可重用字符串?

听起来好像我想要属性值模板,但我能找到的那些表明它们不能用于选择语句

要从上面提取最简单且可能不太有用的示例,假设我希望能够在select语句中包含{{1}}而不必每次都复制文本,有没有办法做到这一点?

注意:我无法在此处存储该部分的结果,因为这是for-each指令中的select。

1 个答案:

答案 0 :(得分:2)

好吧,正如你提到的属性值模板,我想你正在讨论select属性,那么你可能想要在XSLT 3(自今年6月以来的W3C推荐)中学到这一点,并且{{3对于Java,.NET和C ++ / C以及Saxon 9.8 XMLSpy / Raptor 2017或2018,您可以使用所谓的Altova(即_select而不是selectshadow attributes

<xsl:variable name="exp1" as="xs:string" static="yes" select="&quot;not(product_type='configurable')&quot;"/>

然后你可以使用例如。

<xsl:for-each _select="/objects/object/items/item[{$exp1}]">

您也可以使用XSLT 2和3定义您自己的功能,例如

<xsl:function name="mf:exp1" as="xs:boolean">
  <xsl:param name="item"/>
  <xsl:sequence select="not($item/product_type='configurable')"/>
</xsl:function>

然后使用

<xsl:for-each select="/objects/object/items/item[mf:exp1(.)]">

(当然需要将前缀mf或您要使用的任何前缀绑定到函数的命名空间,例如xmlns:mf="http://example.com/mf"。)