XSLT:是否可以选择性缩进?

XSLT: is selective indentation possible?

我正在使用 XSLT 将 XML 转换为 HTML。如果我在 <xsl:output> 中指定 indent='no',则生成的 HTML 中的相邻标签会 运行 一起成为一条长线(它们之间用于布局的所有空白都被删除),这使得很难阅读和理解。但是,如果我指定“indent-'yes'”,HTML 会很好地缩进,但这会完全破坏包含在 <pre> ... </pre>.

中的文本布局

有什么方法可以两全其美,让 indent='yes' 保持不变 <pre> 方块不变?

编辑: 我试图想出一个最小的例子,但我无法重现我所看到的,所以显然还有其他事情在发生。 FWIW,这是我尝试过的:

<?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>

我将此样式表应用于此输入:

<demo>
    <p>Some HTML</p>
    <pre>this is
preformatted text
which should not be<br/>
indented</pre>
    <foo/>
    <hr/>
</demo>

输出看起来像这样:没有缩进,但至少可读。

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Demo</title>
</head>
<body>
<h1>This is a demo</h1>
<hr>

<p>Some HTML</p>

<pre>this is
preformatted text
which should not be<br>
indented</pre>

<h2>This is foo</h2>

<hr>

<hr>
</body>
</html>

我使用的实现是 Java 1.8.

附带的任何实现

事实证明,原来的 XML 有 pre> 个块都在一行上,行之间用 <br/> 分隔,而不是换行。这意味着以下输入:

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

产生了这个输出:

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

解决方案是添加以下规则以将 <br/> 替换为换行符:

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

抱歉浪费了你的时间。