在 XSL 转换中,我有一个相当长的 XPath(大约 20 个不同节点的联合)。因为经常需要这条路径,所以它的缩写会很好。
缩写必须以它在当前上下文中评估的方式进行,因此使用全局变量或其他东西是行不通的。
目标版本是带有 EXSLT 扩展的 XSLT 1.0。
谢谢,
约斯特
如果你不能有一个全局变量,那么一个函数可能是解决方案。
您可以使用实体来提供冗长的 XPath 的缩写。
XSLT 是一个 XML 文件,因此 XML 实体可以在 XSLT 中的任何位置使用。在解析 XSLT 时,实体将被扩展和解析。
您可以对全局 XSLT 变量无法使用的实体执行的操作是在 XPath 中使用实体并匹配表达式。
例如,您可以为长 XPath 语句创建一个实体并在多个位置重新使用它,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stylesheet [
<!ENTITY lengthyXPath "elem1 | elem2 | elem3 | elem4 | elem5 | elem6 | elem7 | elem8 | elem9 | elem10 | elem11 | elem12 | elem13 | elem14 | elem15 | elem16 | elem17 | elem18 | elem19 | elem20">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<output>
<xsl:apply-templates select="/*/*"/>
</output>
</xsl:template>
<xsl:template match="foo">
<xsl:comment>mached foo child elements from: &lengthyXPath;</xsl:comment>
<xsl:apply-templates select="&lengthyXPath;"/>
</xsl:template>
<xsl:template match="bar">
<xsl:comment>mached bar child elements from: &lengthyXPath;</xsl:comment>
<xsl:apply-templates select="&lengthyXPath;"/>
</xsl:template>
<xsl:template match="baz">
<xsl:comment>mached baz child elements from: &lengthyXPath;</xsl:comment>
<xsl:apply-templates select="&lengthyXPath;"/>
</xsl:template>
<xsl:template match="&lengthyXPath;">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
应用于此 XML 时:
<doc>
<foo>
<elem>no match</elem>
<elem1>1</elem1>
<elem>no match</elem>
<elem3>3</elem3>
<elem>no match</elem>
<elem5>5</elem5>
</foo>
<bar>
<elem>no match</elem>
<elem7>7</elem7>
<elem>no match</elem>
<elem9>9</elem9>
<elem>no match</elem>
<elem10>10</elem10>
</bar>
<baz>
<elem>no match</elem>
<elem11>11</elem11>
<elem>no match</elem>
<elem13>13</elem13>
<elem>no match</elem>
<elem15>15</elem15>
</baz>
</doc>
产生以下输出:
<?xml version="1.0" encoding="UTF-8"?>
<output><!--mached foo child elements from: elem1 | elem2 | elem3 | elem4 | elem5 | elem6 | elem7 | elem8 | elem9 | elem10 | elem11 | elem12 | elem13 | elem14 | elem15 | elem16 | elem17 | elem18 | elem19 | elem20--><elem1>1</elem1>
<elem3>3</elem3>
<elem5>5</elem5>
<!--mached bar child elements from: elem1 | elem2 | elem3 | elem4 | elem5 | elem6 | elem7 | elem8 | elem9 | elem10 | elem11 | elem12 | elem13 | elem14 | elem15 | elem16 | elem17 | elem18 | elem19 | elem20--><elem7>7</elem7>
<elem9>9</elem9>
<elem10>10</elem10>
<!--mached baz child elements from: elem1 | elem2 | elem3 | elem4 | elem5 | elem6 | elem7 | elem8 | elem9 | elem10 | elem11 | elem12 | elem13 | elem14 | elem15 | elem16 | elem17 | elem18 | elem19 | elem20--><elem11>11</elem11>
<elem13>13</elem13>
<elem15>15</elem15>
</output>