XSL替换richtext中的属性

时间:2016-06-29 11:22:49

标签: xml xslt replace xml-attribute

我想更改xml节点的内容。 这是我的来源:

<content>
    <p>
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
        <a href="http://www.example.com">
            <strong>http://www.example.com</strong>
        </a>
    At vero eos et accusam et justo duo dolores et ea rebum. 
   </p>
</content>

我想将-Tag中的部分更改为以下结果:

<content>
                    <p>
                        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 
                        <a xlink:show="new" xlink:href="http://www.example.com" xlink:type="simple">
                            <strong>http://www.example.com</strong>
                        </a>
                        At vero eos et accusam et justo duo dolores et ea rebum. 
                    </p>
            </content>

所以,基本上我想将“href”更改为xlik:href。其他所有内容都应保持不变,例如

-tag或-Tag。

我希望我能做到这样的事情:

    <xsl:for-each select=".../content">    

....
....

    <xsl:variable name="content">
            <xsl:copy-of select="content/node()" />
        </xsl:variable>

    <xsl:value-of select="replace($content, 'href', 'xlink:href')" />

....
....

    <xsl:for-each/>

但结果是,所有标签和属性都消失了:

  

Lorem ipsum dolor sit amet,consetetur sadipscing elitr,sed diam   nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,   sed diam voluptua。

                      http://www.example.com

                  At vero eos et accusam et justo duo dolores et ea >rebum.

我只能更改href-Attribute?

1 个答案:

答案 0 :(得分:2)

首先从身份模板开始

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

然后有一个与a元素匹配的模板,该模板会创建一个包含所需属性的新a元素。

<xsl:template match="a">
  <a xlink:show="new" xlink:href="{@href}" xlink:type="simple">
    <xsl:apply-templates select="@*[name()!='href']|node()"/>
  </a>
</xsl:template>

这假设您在XSLT中定义了xlink名称空间前缀。

试试这个XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="a">
    <a xlink:show="new" xlink:href="{@href}" xlink:type="simple">
      <xsl:apply-templates select="@*[name()!='href']|node()"/>
    </a>
  </xsl:template>
</xsl:stylesheet>

编辑:在回答您的评论时,您并不需要xsl:for-each,除非您实际上正在进行其他转换,而不仅仅是更改href属性。模板方法通常是要走的路,绝对值得学习。但如果它有帮助,这是一个使用xsl:for-each的样式表,您可以根据自己的需要进行调整:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <xsl:for-each select="content">
    ...
    <content>
      <xsl:apply-templates select="@*|node()"/>
    </content>
    ...
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="a">
    <a xlink:show="new" xlink:href="{@href}" xlink:type="simple">
      <xsl:apply-templates select="@*[name()!='href']|node()"/>
    </a>
  </xsl:template>
</xsl:stylesheet>