使用XSLT缩进和包装XML文档

时间:2015-03-17 21:34:26

标签: xml xslt formatting indentation wrapping

我想使用单个XSLT样式表文档格式化不同的XML文档。 如何使用XSLT执行以下操作:

  1. 3个空格的缩进?
  2. 100个字符后包裹线?
  3. 设置不是特定于预定义的标记或节点,而是特定于整个XML

2 个答案:

答案 0 :(得分:1)

XSLT通常用于更改文档的结构或内容。在大多数情况下,XML文档中元素的缩进纯粹是cosmetical,因为仅空白文本节点通常不重要。也就是说,有一种有效的方法可以正确地缩进任何XML文档,即指定<xsl:output indent="yes"/>身份转换。但是,缩进字符的数量将取决于您正在使用的XSLT处理器的实现。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"  encoding="UTF-8" indent="yes" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:transform>

将改变

<?xml version="1.0" encoding="UTF-8"?>
<body><h1></h1></body>

<?xml version="1.0" encoding="UTF-8"?>
<body>
   <h1/>
</body>

您可以生成一个文档,该文档在一定数量的字符后包装文本,但这通常不是通过XSLT完成的。 XSLT转换数据,不打算用作渲染代理。换行是应该在显示数据的工具中强制执行的操作,如编辑器。许多编辑器都有换行选项,例如使文档适合当前窗口大小。

因此,总而言之,如果特定数量的空格和换行符号是您要对文档进行的唯一更改,请不要使用XSLT。前者是不可能的,后者也许是荒谬的 - 除非有充分的理由去做。

答案 1 :(得分:1)

  
      
  1. 3个空格的缩进?
  2.   

如果您使用的是Xalan处理器,可以将xsl:output设置为:

<xsl:output method="xml" version="1.0" encoding="UTF-8" xalan:indent-amount="3"/>

否则最好将输出设置为:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

让处理器应用其编程的缩进量以应用。

-

在(不太可能)的情况下,必须具有正好3个空格的缩进,您可以尝试沿着这些行:

<xsl:variable name="spaces" select="'                                           '" />

<xsl:template match="*">
    <xsl:variable name="indent" select="concat('&#10;', substring($spaces, 1, 3*count(ancestor::*)))" />
    <xsl:value-of select="$indent" />
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="node()"/>
        <xsl:value-of select="$indent" />
    </xsl:copy>
</xsl:template>

显然这需要更多的工作(我不愿意投入其中)。


  
      
  1. 100个字符后包裹线?
  2.   

我认为你的意思是文本节点?如果通过XSLT完成,则必须修改实际文本,因此它将超出&#34;格式化#34;的定义。