XSL1.0:如何在特定条件下仅分析标记的文本内容



我有一个简单的问题无法解决。 我有以下 xml 和 xsl。当 SPAN 和 P 标签不在"标题"标签内时,我需要打印出它们的内容,包括它们的内容。在这种情况下,我只想打印出他们的内容。 这是我的代码摘录。现在我总是打印出标签和内容,无法实现我想要的。 这是我正在打印的内容:

<?xml version="1.0" encoding="utf-8"?>
<article class="story-ipad sortir">
<title>
<p>Il était une fois
<span>à jamais</span>
</p>
<title>
<text>
<p>Resequam, necullitae exerio quis por si dolecature et mincta pro. <br/>
</p>
<span>La Belle et la Bête,</span>
</text>
</article>

这就是我想要的:

<?xml version="1.0" encoding="utf-8"?>
<article class="story-ipad sortir">
<title>
Il était une fois à jamais
</title>
<text>
<p>Resequam, necullitae exerio quis por si dolecature et mincta pro. <br/>
</p>
<span>La Belle et la Bête,</span>
</tex

t>

我不能修改太多代码,我想做的是在我的最后一个模板中匹配许多 html 标签,如果标签正在分析是//title/span ecc,则添加一个例外以具有不同的内容。否则,要有另一个模板,我只从"Tiltle"中调用,但仅适用于 span 和 p 标签,因为所有其他标签的行为必须不同。你可以帮我吗?

<xsl:template match="span|div|font|
tt|i|b|big|small|u|s|strike|
em|strong|q|sub|sup|cite|abbr|acronym|
hr|blockquote|center|
img|
table|col|colgroup|thead|tfoot|tbody|tr|p|
th|td|summary" name="html-noclass-t">

例如,此处确定标签是否位于特定路径下的条件


<?xml version="1.0" encoding="utf-8"?>
<doc xml:lang="fr">
<article>
<titles id="U1402860665587eXC">
<title id="U1402864848468jy">
<p id="U1402864848468C8D">Il était une fois <br/>
<span id="U1402864848468aP">à jamais</span>
</p>
</br>
</title>
</titles>
<texte id="U14028606655875nG">
<p>Resequam, necullitae exerio quis por si dolecature et mincta pro. <br/>
</p>
<span id="U1402864848468liD">La Belle et la Bête,</span>
</texte>
</article>
</doc>

使用 XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="no"/>

<xsl:template match="/">
<xsl:apply-templates select="/doc/article" />
</xsl:template>
<xsl:template match="/doc/article">
<article class="story-ipad sortir">
<xsl:call-template name="header"/>
<xsl:call-template name="text"/>
</article>
</xsl:template>
<xsl:template name="header">
<xsl:choose>
<xsl:when test="//article/titles/title">
<xsl:apply-templates select="//article/titles/title"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
<xsl:template name="text">
<xsl:choose>
<xsl:when test="//text">
<xsl:apply-templates select="//text"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
<xsl:template match="span|div|font|
tt|i|b|big|small|u|s|strike|
em|strong|q|sub|sup|cite|abbr|acronym|
hr|blockquote|center|
img|
table|col|colgroup|thead|tfoot|tbody|tr|p|
th|td|summary" name="html-noclass-t">
<xsl:element name="{name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

听起来您正在寻找的是XSLT模式。

我想知道你是否把事情复杂化了。 如果需要包含纯文本内容的<title>元素,请编写 title 元素并直接复制文本内容,而无需调用或应用模板。 如果你想对<title>元素的某些后代进行特殊行为,你可以编写具有不同匹配项的不同模板,例如:

我建议尝试这样的事情是否做你想做的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="/doc/article" />
</xsl:template>
<xsl:template match="/doc/article">
<article class="story-ipad sortir">
<title>
<xsl:apply-templates select="titles/title"/>
</title>
<text>
<xsl:apply-templates select="texte/*"/>
</text>
</article>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="title//*[self::p or self::span or self::br]">
<xsl:apply-templates select="node()"/>
</xsl:template>
</xsl:stylesheet>

当应用于您的源文档时(我对其进行了修改,因为它有一个没有匹配的开始</br>的结束):

<?xml version="1.0" encoding="utf-8"?>
<article class="story-ipad sortir">
<title>Il était une fois à jamais</title>
<text>
<p>Resequam, necullitae exerio quis por si dolecature et mincta pro. <br/>
</p>
<span>La Belle et la Bête,</span>
</text>
</article>

结果是:

<?xml version="1.0" encoding="utf-8"?>
<article class="story-ipad sortir">
<title>
<title>
Il était une fois 
à jamais

</title>
</title>
<text>
<p>Resequam, necullitae exerio quis por si dolecature et mincta pro. <br/>
</p>
<span>La Belle et la Bête,</span>
</text>
</article>

我注意到另一件事:你正在使用这样的结构

<xsl:choose>
<xsl:when test="//article/titles/title">
<xsl:apply-templates select="//article/titles/title"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>

这相当于这一行:

<xsl:apply-templates select="//article/titles/title"/>

在任何情况下都可以省略空<xsl:otherwise>,这只剩下单个案例。 在测试单个案例时,<xsl:if>更好。 但一般来说,<xsl:if><xsl:choose>被过度使用,因为在许多情况下,<xsl:apply-templates>可以完成这项工作,并且被认为是 XSLT 中更好的做法。

你所做的是多余的双重检查:你首先检查"有没有东西可以提供给<xsl:apply-templates>?",如果没有东西可以提供,你就什么都不做。 但是,当什么都没有提供时,<xsl:apply-templates>无论如何都不会做任何事情。 因此,无需检查。 如果没有标题,<xsl:apply-templates>什么都不会做,如果有标题,你无论如何都会调用它。

相关内容

  • 没有找到相关文章

最新更新