【发布时间】:2017-02-20 13:51:14
【问题描述】:
我想使用应用模板处理节点,但使用不同的模式为序列中的所有节点匹配正确的模板规则。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<story>
<p class="h1">
<content>heading</content>
<br/>
</p>
<p>
<content>some text</content>
<br/>
<content>more text...</content>
</p>
</story>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:element name="div">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="p">
<xsl:choose>
<xsl:when test="@class='h1'">
<xsl:element name="h1">
<!--apply-tempaltes mode:#default, for br mode:ignore-->
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="p">
<!--apply-tempaltes mode:#default-->
<xsl:apply-templates/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="content" mode="#default">
<xsl:element name="span">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="br" mode="#default">
<xsl:element name="br"/>
</xsl:template>
<xsl:template match="br" mode="ignore"/>
</xsl:stylesheet>
想要的输出:
<?xml version="1.0" encoding="UTF-8"?>
<story>
<h1 class="h1"><span>heading</span>
</h1>
<p><span>some text</span>
<br/>
<span>more text...</span>
</p>
</story>
XSLT 版本是 2.0。我知道,还有其他方法可以实现此示例所需的输出,但我想使用模式属性。
【问题讨论】:
-
你还没有告诉我们想要的输出是什么。我们要读懂你的心吗?我不知道这是什么意思:“apply-tempaltes mode:#default, for br mode:#ignore”。您需要告诉我们您要完成的工作。
-
我想知道,我是否可以对序列中的所有项目使用不同的模式。只要我使用模式
ignore,#default将不起作用。我可以使用mode="#all"作为模板match="content"。我敢肯定,有更好的解决方案。 -
仍然不清楚,请告诉我们目标,而不是询问模式。如果
br元素在p[@class = 'h1']元素内,您是否要忽略(即:不复制到结果文档)? -
好吧,也许我选择了一个不好的例子。目标是根据名称以不同的模式处理
<xsl:apply-templates/>的项目。是的,我想忽略brelements 但不在匹配模式中使用谓词。 -
你可以写两个
xsl:apply-templates,例如<xsl:apply-templates select="node() except br"/>,<xsl:apply-templates select="br" mode="mode-name"/>,只是当你想忽略你根本不需要第二个 apply-templates 的元素时,只适用于node() except br就足够了。