我有两个匹配相同属性的模板,两个模式都有不同的模式(如下所示)。有没有办法可以避免两次写入属性,每个模板一个,然后将这些属性存储在一个变量中?因此,除了下面的匹配语句,我将匹配 match = $ styleAttributes ,并且 styleAttributes 将设置为所有属性。这将使用2.0版(Saxon 9.1.0.7)。感谢。
<xsl:template match="@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize" mode="styles">
<!-- Do something -->
</xsl:template>
<!-- Do nothing -->
<xsl:template match="@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize" mode="common" />
答案 0 :(得分:1)
好吧,您可以使用"@*"
匹配所有内容,然后在模板中针对全局变量检查local-name()
,然后使用不同的@mode=
调用另一个模板,具体取决于失败。
SO是一个非常棒的资源,但对于纯XSLT问题,没有什么比Mulberry Technologies运行的xsl-list更好了。它由XSLT产品的供应商和用户以及负责规范的W3C委员会成员代表。
答案 1 :(得分:1)
即使在XSLT 2.0中,match pattern只能包含一个可靠的引用作为谓词的一部分,或者作为key()或{{3的参数(表达式)的一部分}} 功能。 这决定了直接问题的否定答案。
但是,如果我们需要避免在只有模式不同的两个模板中重复相同的匹配模式,那么实现此目的的一种方法是仅使用一个没有模式的模板并传递(以前是) mode作为模板的参数。
以下是一个小例子:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:apply-templates select="@*"/>
</xsl:template>
<xsl:template match=
"@width|@height|@visible|@vAlign|@hAlign|@zOrder|@hOffset|@vOffset|@color|@fontSize">
<xsl:param name="procMode" as="xs:string" select="'common'"/>
<xsl:sequence select=
"if($procMode = 'common')
then
'Hello from the Common Processor'
else
'Hello from the Styles Processor'
"
/>
</xsl:template>
</xsl:stylesheet>
对此XML文档应用上述转换时:
<div width="50"/>
产生了想要的结果:
来自通用处理器的Hello