2013-04-29 39 views
0

UPDATEXSLT將子女<span>注入<a>文字?

我已經修改了我的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(., &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> 

我希望能夠有一個<span><copy-of select="."/></span>爲這個孩子<template match="" >但它似乎並沒有工作。

我已經研究過,但XSLT不是我熟悉的東西,並嘗試了幾種方法來實現這個我卡住了。我試過<apply-templates />,<value-of /><copy-of />沒有成功。

+0

當你說「它不工作」,你的意思是你得到一個錯誤,或者它沒有輸出你所期望的?無論哪種情況,你能顯示當前的輸出嗎?謝謝! – 2013-04-29 11:10:03

回答

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"> 

啓動之後,你可以參考HTML通過使用htm:div等與其他節點分開。

我試圖整理XSLT,但代碼很糟糕,我無法理解模板中應該包含的巨大match模式。我只想說,你應該能夠通過使用

<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> 

我希望這有助於你想影響a元素相匹配。

+0

在那裏我有XML爲 'Anchor Text' 我想 'Anchor Text'。 此解決方案似乎在一個範圍內移動了整個''元素,但我想要在''範圍內但''值之外的''。 – 2013-04-29 11:33:19

+0

以上XSL幾乎讓我有,但錨元素缺少href屬性和類別屬性等,否則這工作。爲什麼不包含屬性? – 2013-04-29 12:20:16

0

看起來你有點混淆命名空間。 你儘量避免XLST前綴與

xmlns="http://www.w3.org/1999/XSL/Transform" 

我不會做,但任何方式。
<a>標籤是因爲

<p xmlns="http://www.w3.org/1999/xhtml"> 
在XML

形式XHTML命名空間。

如果您嘗試使用xslt作爲默認命名空間,則必須爲xhtml添加xhtml的命名空間前綴。

xmlns:h="http://www.w3.org/1999/xhtml" 

現在你可以用你的標籤相匹配:

<template match="h:a"> 

而且跨度不能沒有命名空間使用(因爲它沒有XLST)。您可以使用 :

<element name="span" namespace="http://www.w3.org/1999/xhtml"> 
     <copy-of select="."/> 
</element> 

但我會建議使用一個命名空間前綴的XSLT。

更新: 要讓跨度大約只有一臺帶類屬性,它包含了 'CTA-按鈕' 使用:

<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"> 
+0

一旦你定義'xmlns:h',你可以使用'' – Borodin 2013-04-29 11:15:22

+0

'[@class [contains(。,'cta-button')]]'通常寫成'[contains(@ class,'cta-按鈕')]' – Borodin 2013-04-29 11:16:29

+0

@Borodin:謝謝,但使用''我無法抑制'h:'前綴。 – 2013-04-29 11:25:38

相關問題