XSLT:更改节点内部文本

时间:2010-05-22 16:37:22

标签: xslt

我需要转换以下xml doc:

<a>
  <b/>
  <c/>
   myText
</a>

进入这个:

<a>
  <b/>
  <c/>
   differentText
</a>

所以,我写了这个XSLT文档

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" />

  <xsl:template match="/a/text()">
    <a>
      <b/>
      <c/>
      differentText
    </a>
</xsl:template>
</xsl:stylesheet>

这样,我得到以下结果:

<?xml version="1.0" encoding="utf-8"?>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>

结果重复出现3次,因为正在进行3场比赛。为什么?我能解决它吗?感谢

2 个答案:

答案 0 :(得分:8)

排除仅限whtespace的文本节点。了解并使用<xsl:strip-space>指令

此转化

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

 <xsl:template match="a/text()">
   <xsl:text>Diferent text</xsl:text>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时,会生成所需的正确结果

特定模板的匹配表达式中不需要复杂的谓词

我们应该努力寻求最简单,最短,最优雅,最易读,最易理解的解决方案,充分利用语言的力量。

有可能这样的解决方案将被最容易理解,最容易实现,并且最有可能被任何XSLT处理器优化,从而实现最有效的实现。

答案 1 :(得分:6)

三个匹配,用方括号突出显示:

<a>[
  ]<b/>[
  ]<c/>[
   myText
]</a>

你想要这样的东西:

<xsl:template match="/a/text()[normalize-space() != '']">