如何查找<a> elements with specific keywords in href using XSL?</a>

时间:2012-12-29 14:39:28

标签: xml xslt

我正在尝试将一个HTML写入BBCode转换器,但作为一个完整的XSL新手,我需要帮助打破僵局。这是我到目前为止所得到的:

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

<xsl:template match="h1|h2|h3|h4">[h]<xsl:apply-templates/>[/h]</xsl:template>
<xsl:template match="b|strong">[b]<xsl:apply-templates/>[/b]</xsl:template>
<xsl:template match="i|em">[i]<xsl:apply-templates/>[/i]</xsl:template>
<xsl:template match="u">[u]<xsl:apply-templates/>[/u]</xsl:template>
<xsl:template match="br">&#10;</xsl:template>
<xsl:template match="p">&#10;<xsl:apply-templates/>&#10;&#10;</xsl:template>
<xsl:template match="img">[img]<xsl:value-of select="@src"/>[/img]</xsl:template>
<xsl:template match="a">[url="<xsl:value-of select="@href"/>"]<xsl:apply-templates/>[/url]</xsl:template>

<xsl:template match="style|script"></xsl:template>

</xsl:stylesheet>

您如何匹配<a>中具有特定关键字的href并删除这些节点,同时保留其他节点?然后检查这些<a>是否为空,从而决定是使用[url]http://foo[/url]还是[url="http://foo"]bar[/url]

例如:

<a href="http://spammycrap.tld">Foo</a>
<a href="http://empty.tld"></a>
<a href="http://okay.tld">Baz</a>

期望的输出:

[url]http://empty.tld[/url]
[url="http://okay.tld"]Baz[/url]

3 个答案:

答案 0 :(得分:2)

要删除href属性中包含不需要的字符串的锚点,请展开match XPath表达式:

<xsl:template match="a[not(contains(@href,'Foo'))]">...

Foo可能是spammycrap.com或其他任何内容。

此外,您可以为空锚和非空锚指定不同的模板。因此,对于非空锚,您可以使用:

<xsl:template match="a[not(contains(@href,'Foo')) and not(count(node()) = 0)]">...

后跟非空锚的模板。然后是空锚:

<xsl:template match="a[not(contains(@href,'Foo')) and not(node())]">...

后面是空锚的模板。

总的来说,这变成了:

<xsl:template match="a[not(contains(@href,'Foo')) and not(count(node()) = 0)]">[url="<xsl:value-of select="@href"/>"]<xsl:apply-templates/>[/url]</xsl:template>

<xsl:template match="a[not(contains(@href,'Foo')) and not(node())]">[url]<xsl:value-of select="@href"/>[/url]</xsl:template>

答案 1 :(得分:1)

您可以使用空模板忽略特定元素,例如

<xsl:template match="a[contains(@href, 'badurl')]" />

要查找非空a元素,您可以使用

<xsl:template match="a[*|text()[normalize-space(.)]]">
  <xsl:text>[url="</xsl:text>
  <xsl:value-of select="@href"/>
  <xsl:text>"]</xsl:text>
  <xsl:apply-templates/>
  <xsl:text>[/url]</xsl:text>
</xsl:template>

匹配任何具有子元素或不完全是空格的文本节点的锚点。与此模式不匹配的锚点将由通用match="a"模板

获取
<xsl:template match="a">[url]<xsl:value-of select="@href" />[/url]</xsl:template>

答案 2 :(得分:0)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="a[starts-with(@href, 'http://spammy')]"/>

 <xsl:template match="a[not(*|text()[normalize-space(.)])]">
  <xsl:text>[url]</xsl:text>
    <xsl:value-of select="@href"/>
  <xsl:text>[/url]&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="a">
  <xsl:text>[url="</xsl:text>
  <xsl:value-of select="@href"/>"]<xsl:text/>
  <xsl:value-of select="."/>
  <xsl:text>[/url]&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时:

<html>
    <a href="http://spammycrap.tld">Foo</a>
    <a href="http://empty.tld"></a>
    <a href="http://empty2.tld">    </a>
    <a href="http://okay.tld">Baz</a>
</html>

会产生想要的正确结果:

[url]http://empty.tld[/url]
[url]http://empty2.tld[/url]
[url="http://okay.tld"]Baz[/url]