XSLT如何处理散布着其他XML元素的多个XML文本节点

时间:2012-08-29 21:41:51

标签: xslt

当一个元素包含散布文本的其他元素时,如何维护文本元素的顺序?在这个(简化的)例子中:

  <block>1st text<bsub>2nd text</bsub>3rd text</block>

所需的输出是:

  "1st text 2nd text 3rd text"

我试过了:

  <xsl:template match="block">
    <xsl:value-of select=".">
    <xsl:apply-templates select="bsub"/>
    <xsl:value-of select=".">
  </xsl:template>

  <xsl:template match="bsub">  
    <xsl:value-of select=".">
  </xsl:template>

和那些输出:

  "1st text 2nd text 3rd text 2nd text 1st text 2nd text 3rd text"

如何使用<block>选择单个文本元素(<xsl:value-of>)?

2 个答案:

答案 0 :(得分:0)

不要使用value-of来处理这样的混合内容 - 请改用apply-templates,它将全部适用于您。

答案 1 :(得分:0)

这个XSLT 1.0样式表...

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

<xsl:template match="/">
  <t>
   <xsl:apply-templates />
  </t>
</xsl:template>

<xsl:template match="block|bsub">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="text()">
  <xsl:value-of select="concat(.,' ')" />
</xsl:template>

</xsl:stylesheet>

...应用于您的输入文档...

<block>1st text<bsub>2nd text</bsub>3rd text</block>

... ...产量

<t>1st text 2nd text 3rd text </t>