我正在试图弄清楚如何保存我正在排序的节点之间的空白节点。这是一个例子。
输入:
<a>
<b>
<c>
<d>world</d>
</c>
<c>
<d>hello</d>
</c>
</b>
<e>some other stuff</e>
</a>
期望的输出:
<a>
<b>
<c>
<d>hello</d>
</c>
<c>
<d>world</d>
</c>
</b>
<e>some other stuff</e>
</a>
这是我的xslt:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="a/b">
<xsl:copy>
<xsl:apply-templates select="c">
<xsl:sort select="d"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当我通过xsltproc运行它时,我得到了这个:
<a>
<b><c>
<d>hello</d>
</c><c>
<d>world</d>
</c></b>
<e>some other stuff</e>
</a>
之后我宁愿不经过整理。想法?
答案 0 :(得分:3)
您希望将这两行添加到样式表的顶部:
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
第一行从文档中删除所有空格,第二行缩进输出。
答案 1 :(得分:1)
您的第二个模板与所有b匹配,但仅在c元素上应用模板。包含的文本节点被丢弃。这就是为什么你没有在输出中看到b和c元素之间的空白。
您必须重新格式化树,因为重新排序后文本节点看起来不会很漂亮(即使您设法包含它们)。安德鲁斯的解决方案就是这样做的。