我想更改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?
答案 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>