本文介绍了XSLT:如何保留元素之间的空格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个新要求,要使转换后的XML更具可读性,即保留元素之间的cr、制表符和其他空白。
我似乎想不出如何保留空格。
谁能帮帮忙?
XML文件
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
</Fragment>
</Wix>
XSL文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:m="http://schemas.microsoft.com/wix/2006/wi">
<xsl:preserve-space elements="*" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/m:Wix">
<xsl:message>Matched Wix</xsl:message>
<xsl:copy>
<!-- Insert the new include processing instruction -->
<xsl:processing-instruction name="include">
<xsl:text>$(sys.CURRENTDIR)src/includes/globals.wxi </xsl:text>
</xsl:processing-instruction>
<!-- place the existing children into the output -->
<xsl:apply-templates select="@* | *"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当前产量:
<?xml version="1.0" encoding="UTF-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"><?include $(sys.CURRENTDIR)src/includesglobals.wxi ?><Fragment>
</Fragment></Wix>
所需输出:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include $(sys.CURRENTDIR)src/includesglobals.wxi ?>
<Fragment>
</Fragment>
</Wix>
推荐答案
您的输入中有三个空白文本节点:两个是片段元素的同级,另一个是片段元素的子级。
前两个元素不会复制到您的输出中,因为m:wix元素的模板忽略了它们:它<xsl:apply-templates select="@* | *"/>
只选择元素子项,而不选择文本节点子项。
将处理片段的空白文本内容,并将其保留在输出中。
现在:您在问题中说了两件事:(A)希望使输出可读,(B)希望保留输入中的空格。我认为(B)不是实现(A)的最佳方式。实现(A)的最佳方法是忽略输入中存在的空格,并使用xsl:output indent="yes"
在输出中添加新空格。
但是,如果您确实希望将空白从输入复制到输出,则在处理元素的子项时需要使用select="node()"
而不是select="*"
。
这篇关于XSLT:如何保留元素之间的空格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!