【发布时间】:2018-04-03 11:21:58
【问题描述】:
我上周已经发布了有关相邻组合并的问题。 我很新,可能有一些我不明白的东西......
所以我有一个模板,可以将相邻组与其 CSS 类名合并。
<xsl:template name="fusionElements">
<xsl:param name="classFusion" />
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:for-each-group select="node() except text()[not(normalize-space())]" group-adjacent="@class=$classFusion">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:for-each-group select="current-group()" group-by="concat(node-name(.), '|', $classFusion)">
<xsl:element name="{name()}" namespace="{namespace-uri()}">
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="current-group()/node()" />
</xsl:element>
</xsl:for-each-group>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()" />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
然后我像这样调用模板。我正在搜索具有多个 spans 且具有相同 CSS 类的 p 节点。
<xsl:template match="p[contains(@class, 'Normal')][count(./span[contains(@class, 'USous-article')])>0]">
<xsl:call-template name="fusionElements">
<xsl:with-param name="classFusion" select="./span[1][contains(@class,'USous-article')]/@class" />
</xsl:call-template>
<xsl:template match="p[contains(@class, 'Normal')][count(./span[contains(@class, 'UCitation')])>0]">
<xsl:call-template name="fusionElements">
<xsl:with-param name="classFusion" select="./span[1][contains(@class,'UCitation')]/@class" />
</xsl:call-template>
它可以正常工作,除非我在同一 p 内有具有不同 CSS 类的相邻节点
<p class="Normal">
<a name="Art10Prg1"><!--anchor--></a>
<span class="USous-article Default">§</span>
<span class="USous-article Default"> </span>
<span class="USous-article Default">1er</span>
<span class="USous-article Default"> </span>
<span class="USous-article Default">-</span>
<span class="UCitation Default">a)</span>
<span class="UCitation Default"> </span>
Some text!</p>
我想要做的是:
<p class="Normal">
<a name="Art10Prg1"><!--anchor--></a>
<span class="USous-article Default">§ 1er -</span>
<span class="UCitation Default">a) </span>
Some text!</p>
我理解错误(两个不同的模板匹配同一个节点)但我不知道如何解决问题。
Warning XTDE0540: Ambiguous rule match for /html/body[1]/div[2]/p[219] Matches both p span "UCitation" and p span "USous-article"
【问题讨论】:
-
首先,您会收到警告而不是错误。至于解决它,你想发生什么,应用这两个具有更高优先级的模板之一?您可以设置
priority属性一个xsl:template例如<xsl:template match="p[contains(@class, 'Normal')][count(./span[contains(@class, 'UCitation')])>0]" priority="5">。如果您这样做,警告将消失,处理器仅应用具有最高优先级的模板(而不是使用文档顺序中的最后一个)。 -
我尝试应用优先级,但这意味着某些标签不会被合并。这就是为什么我开始问我的解决方案是否真的很好。但我不知道没有优先权怎么办……
-
我认为需要更改方法以实现该分组,但是从一个示例和一些不工作的代码(这是合并的规则)中有点难以理解。 xsltfiddle.liberty-development.net/pPqsHSZ 中的代码对您的示例 sn-p 进行了正确的合并,但在
spans 之间丢失了空格,并且按照当前编写的方式,还将合并相邻的span class="foo"不包含您正在寻找的两个类。我认为您需要重新表述问题并更详细地解释代码必须有多灵活以及输入可以有哪些变化。