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> </xsl:text>
</xsl:template>
抱歉浪费了你的时间。
我正在使用 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> </xsl:text>
</xsl:template>
抱歉浪费了你的时间。