XSLT:如何保留元素之间的空格? [英] XSLT: How to preserve whitespace between elements?

查看:16
本文介绍了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:如何保留元素之间的空格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆