XSLT:更改节点内部文本

Nab*_*abo 8 xslt

我需要转换以下xml文档:

<a>
  <b/>
  <c/>
   myText
</a>
Run Code Online (Sandbox Code Playgroud)

进入这个:

<a>
  <b/>
  <c/>
   differentText
</a>
Run Code Online (Sandbox Code Playgroud)

所以,我写了这个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>
Run Code Online (Sandbox Code Playgroud)

这样,我得到以下结果:

<?xml version="1.0" encoding="utf-8"?>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>
<a>
  <b /><c />
  differentText
</a>
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Tom*_*lak 6

这里三场比赛中,方括号所强调的:

<a>[
  ]<b/>[
  ]<c/>[
   myText
]</a>
Run Code Online (Sandbox Code Playgroud)

你想要的东西:

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

  • @Dimitre:我知道.我的答案提供了对现有代码的尽可能少的更改.它基于这样的假设:实际代码更复杂,而"<xsl:strip-space>"可能会在其他地方引起副作用. (4认同)