给出以下片段:
<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>
答案 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>