2

给定以下片段:

<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>
4

1 回答 1

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

<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>
于 2013-05-22T14:49:55.440 回答