XSL:查找当前不在元素中的文本并换行?

时间:2013-05-22 14:46:19

标签: xslt xpath xslt-1.0

给出以下片段:

<recipe>
  get a bowl
  <ingredient>flour</ingredient>
  <ingredient>milk</ingredient>
  mix it all together!
</recipe>

如何匹配“get a bowl”和“mix it all together!”并将它们包装在另一个元素中以创建以下内容?

<recipe>
  <action>get a bowl</action>
  <ingredient>flour</ingredient>
  <ingredient>milk</ingredient>
  <action>mix it all together!</action>
</recipe>

1 个答案:

答案 0 :(得分:4)

您可以定义匹配文本节点的模板,这些节点是recipe的直接子节点:

<xsl:template match="recipe/text()">
  <action><xsl:value-of select="normalize-space()" /></action>
</xsl:template>

完整的XSLT示例:

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

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

  <xsl:template match="recipe/text()">
    <action><xsl:value-of select="normalize-space()" /></action>
  </xsl:template>

</xsl:stylesheet>

请注意normalize-space() 是必需的,即使使用xsl:strip-space - 只影响仅包含 空格的文本节点,它也不会t从包含任何非空白字符的节点中去除前导和尾随空格。如果你有

<action><xsl:value-of select="." /></action>

然后结果就像

<recipe>
  <action>
  get a bowl
  </action>
  <ingredient>flour</ingredient>
  <ingredient>milk</ingredient>
  <action>
  mix it all together!
</action>
</recipe>