3

在 XSL 转换中,我有一个相当长的 XPath(大约 20 个不同节点的联合)。因为经常需要这条路径,所以它的缩写会很好。

缩写必须以它在当前上下文中评估的方式进行,因此使用全局变量或其他东西是行不通的。

目标版本是带有 EXSLT 扩展的 XSLT 1.0。

谢谢,
约斯特

4

2 回答 2

3

如果你不能有一个全局变量,那么一个函数可能是解决方案。

于 2012-08-31T20:04:09.487 回答
1

您可以使用实体来提供冗长的 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>
于 2012-09-01T00:37:17.597 回答