更新
我已将XSL修改为:
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:h="http://www.w3.org/1999/xhtml">
<output omit-xml-declaration="yes" method="xml" cdata-section-elements="script"></output>
<template match="/ | node() | @*">
<copy>
<apply-templates select="node() | @*"></apply-templates>
</copy>
</template>
<template match="@class[.='cta-button-secondary']">
<attribute name="class">cta-button secondary</attribute>
<element name="span" namespace="http://www.w3.org/1999/xhtml">
<value-of select=".." />
</element>
</template>
</stylesheet>
除了<a>
文本被复制之外,这几乎满足了我的需求。我想要在新的子<span>
中复制的锚文本,并希望丢弃剩余的重复值。
有什么建议吗?
如何使用XSLT在<a>
元素中的文本周围注入<span>
?
XLST:
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
<output omit-xml-declaration="yes" method="xml" cdata-section-elements="script"> </output>
<template match="/ | node() | @*">
<copy>
<apply-templates select="node() | @*"></apply-templates>
</copy>
</template>
<template match="*[ (self::br or self::p or self::div) and normalize-space(translate(., ' ', '')) = '' and not(@*) and not(processing-instruction()) and not(comment()) and not(*[not(self::br) or @* or * or node()]) and not(following::node()[not( (self::text() or self::br or self::p or self::div) and normalize-space(translate(., ' ', '')) = '' and not(@*) and not(processing-instruction()) and not(comment()) and not(*[not(self::br) or @* or * or node()]) )]) ]">
<!-- ignore all paragraphs and line-breaks at the end that have nothing but (non-breaking) spaces and line breaks -->
</template>
<template match="br[parent::div and not(preceding-sibling::node()) and not(following-sibling::node())]">
<!-- Chrome generates <div><br/></div>. Renders differently in different browsers. Replace it with a non-breaking space -->
<text> </text>
</template>
<template match="@class[.='cta-button-secondary']">
<attribute name="class">cta-button cta-button-secondary</attribute>
</template>
<template match="a[@class(contains('cta-button'))]">
<span>
<copy-of select="."/>
</span>
</template>
</stylesheet>
XML:
<Content xmlns="uuid:3f71252b-6e99-47f2-8906-ff4488c188a1">
<step_title>Expand our impact</step_title>
<heading_line_1>Expand our impact</heading_line_1>
<title_emphasis>Line 1</title_emphasis>
<intro_text>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labasdsadore et dolore magna
aliqua.c</intro_text>
<expand_button_label>More about this</expand_button_label>
<body>
<h3 xmlns="http://www.w3.org/1999/xhtml">How we spent it</h3>
<ol xmlns="http://www.w3.org/1999/xhtml" class="ordered">
<li>ordered list item 1</li>
<li>ordered list item 2</li>
<li>ordered list item 3</li>
<li>ordered list item 4</li>
<li>ordered list item 5</li>
<li>ordered list item 6</li>
<li>ordered list item 7</li>
<li>ordered list item 8</li>
<li>ordered list item 9</li>
<li>ordered list item 10</li>
<li>ordered list item 11</li>
<li>ordered list item 12</li>
</ol>
<p xmlns="http://www.w3.org/1999/xhtml">Thanks to the hard work of our supporters we increased what we spent on cancer services to a
record £105.9 million in 2011. That's £10 million more than in 2010.</p>
<p xmlns="http://www.w3.org/1999/xhtml">For a full breakdown of these charts, take a look at our <a href="#">Annual report and accounts
2011</a> or <a href="#" class="cta-button-secondary">Our 2011 achievements.</a></p>
</body>
<quote xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="tcm:5-13343" xlink:title="Quote2"/>
<right_column_image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="tcm:5-13350"
xlink:title="Wise with money graph"/>
</Content>
我小时候就希望能有一个<template match="" >
和<span><copy-of select="."/></span>
,但似乎不起作用。
我已经研究过了,但XSLT不是我熟悉的东西,在尝试了几种方法之后,我陷入了困境。我尝试过<apply-templates />
、<value-of />
和<copy-of />
,但都没有成功。
您编写的样式表声明了一个默认名称空间,URI为http://www.w3.org/1999/XSL/Transform
,没有其他名称空间,因此您不能引用源数据中任何名称空间中的任何元素。
基本上,您需要在样式表中指定正在使用的所有名称空间,否则将无法识别正在使用的元素名称。例如,a
有一个名称空间
源文档中有三个名称空间,样式表中有一个名称空间(用于XSLT本身(,因此您的转换应该从之类的东西开始
<xsl:stylesheet version="1.0"
xmlns:src="uuid:3f71252b-6e99-47f2-8906-ff4488c188a1"
xmlns:htm="http://www.w3.org/1999/xhtml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
此后,您可以使用htm:div
等将HTML节点与其他节点分开引用
我试图整理您的XSLT,但代码太糟糕了,我无法理解巨大的match
模式在您的模板中意味着什么。只要说你应该能够通过使用来匹配你想要影响的a
元素就足够了
<xsl:template match="htm:a[contains(@class, 'cta-button')]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<htm:span>
<xsl:value-of select="."/>
</htm:span>
</xsl:copy>
</xsl:template>
我希望这能有所帮助。
看起来您有点混淆了名称空间。您尽量避免使用的xlst前缀
xmlns="http://www.w3.org/1999/XSL/Transform"
我不会那样做,但无论如何
由于,您的<a>
标记是xhtml命名空间
<p xmlns="http://www.w3.org/1999/xhtml">
在xml中。
如果您试图将xslt作为默认名称空间,则必须在xsl中添加xhtml的名称空间前缀。
xmlns:h="http://www.w3.org/1999/xhtml"
现在你可以将你的标签与匹配
<template match="h:a">
此外,在没有命名空间的情况下不能使用span(因为它不是xlst(。你可以用途:
<element name="span" namespace="http://www.w3.org/1999/xhtml">
<copy-of select="."/>
</element>
但是我建议使用xslt的名称空间前缀
更新:要使跨度仅围绕包含"cta-button"的with-class属性,请使用:
<template match="h:a[@class[contains(.,'cta-button')]]">
<element name="span" namespace="http://www.w3.org/1999/xhtml">
<copy-of select="."/>
</element>
</template>
样式表应该看起来像:
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:h="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="h"
version="1.0">