XSLT将子<span>注入<a> text?</a> </span>

时间:2013-04-29 09:41:41

标签: xslt xslt-1.0

更新

我修改了我的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在<span>元素中的文本周围注入<a>

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(., &apos; &apos;, &apos;&apos;)) = &apos;&apos;     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(., &apos; &apos;, &apos;&apos;)) = &apos;&apos;        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 />但没有成功。

2 个答案:

答案 0 :(得分:0)

看起来你对命名空间有点混淆了。 您尝试使用

来避免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使用名称空间前缀。

更新: 要使span只围绕包含'cta-button'的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">

答案 1 :(得分:0)

您编写的样式表声明了一个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>

我希望这会有所帮助。