XSLT:选择性缩进是可能的吗?

XSLT:选择性缩进是可能的吗?,xslt,indentation,pre,Xslt,Indentation,Pre,我正在使用XSLT将XML转换为HTML。如果我在中指定indent='no',则生成的HTML中的相邻标记将一起运行到一个长行中(它们之间布局的所有空白都被删除),这使得阅读和理解非常困难。但是,如果我指定“缩进-‘是’”,HTML会很好地缩进,但这会完全破坏 <?xml version='1.0'?> <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <

我正在使用XSLT将XML转换为HTML。如果我在
中指定
indent='no'
,则生成的HTML中的相邻标记将一起运行到一个长行中(它们之间布局的所有空白都被删除),这使得阅读和理解非常困难。但是,如果我指定“缩进-‘是’”,HTML会很好地缩进,但这会完全破坏

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

<xsl:template match="demo">
  <html>
    <head>
       <title>Demo</title>
    </head>
    <body>
      <h1>This is a demo</h1>
      <hr/>
      <xsl:apply-templates/>
      <hr/>
    </body>
  </html>
</xsl:template>

<xsl:template match="foo">
  <h2>This is foo</h2>
</xsl:template>

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

</xsl:stylesheet>
我将此样式表应用于此输入:

<pre>        public static void main(String[] args) {<br />          <textarea cols='60' rows='10'></textarea><br />        }</pre>

一些HTML

<pre>        public static void main(String[] args) {<br>          
<textarea cols="60" rows="10"></textarea>
<br>        }</pre>
这是 预格式化文本 不应该是
缩进
输出是这样的:没有缩进,但至少可读

<xsl:template match="pre//br">
  <xsl:text>&#10;</xsl:text>
</xsl:template>

演示
这是一个演示

一些HTML

<pre>        public static void main(String[] args) {<br>          
<textarea cols="60" rows="10"></textarea>
<br>        }</pre>
这是 预格式化文本 不应该是
缩进 我是福


我正在使用的实现是Java 1.8附带的任何东西。

结果是原始XML在一行上有
pre>
所有块,行之间用

分隔,而不是换行符。这意味着以下输入:

publicstaticvoidmain(字符串[]args){

产生了以下输出:

publicstaticvoidmain(String[]args){

}
解决方案是添加以下规则,用换行符替换

s:





很抱歉浪费了您的时间。

原来,原始XML在一行中包含了
pre>
所有块,行之间用

分隔,而不是换行符。这意味着以下输入:

publicstaticvoidmain(字符串[]args){

产生了以下输出:

publicstaticvoidmain(String[]args){

}
解决方案是添加以下规则,用换行符替换

s:





很抱歉浪费了您的时间。

请发表一篇文章。这可能有助于我们准确解释您使用的XSLT版本、xsl:output方法和XSLT处理器。例如,在XSLT3中,您将看到
xsl:output
具有
suppress indentation
属性。另一方面,您会发现,例如method
html
中定义的序列化规则已经说明了,例如,“不能在格式化元素中添加或删除空格,格式化元素是pre、script、style、title和textarea”。请发布一个。这可能有助于我们准确解释哪个XSLT版本,使用哪个
xsl:output
方法和哪个XSLT处理器。例如,在XSLT3中,您将看到
xsl:output
具有
suppress indentation
属性。另一方面,您会发现在方法
html
的实例中定义的序列化规则已经说明了,例如,“不能在格式化元素中添加或删除空格,格式化元素是pre、script、style、title和textarea”。
<xsl:template match="pre//br">
  <xsl:text>&#10;</xsl:text>
</xsl:template>