XSLT: возможен ли выборочный отступ? - PullRequest
1 голос
/ 21 июня 2020

Я использую XSLT, чтобы преобразовать XML в HTML. Если я укажу indent='no' в <xsl:output>, смежные теги в сгенерированном HTML объединяются в одну длинную строку (все пробелы для макета между ними удаляются), что очень затрудняет чтение и понимание. Однако, если я укажу "indent-'yes '", HTML будет иметь хороший отступ, но это полностью разрушит макет текста, заключенного в ... .

Есть ли способ получить лучшее из в обоих мирах, имея 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>

Я применил эту таблицу стилей к этому вводу:

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

и результат выглядел так: без отступов, но, по крайней мере, читаемый.

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

Это foo



Реализация, которую я использую, - это все, что поставляется с Java 1.8.

1 Ответ

0 голосов
/ 22 июня 2020

Оказалось, что исходный XML имел pre> блоков на одной строке, причем строки были разделены <br/>, а не символами новой строки. Это означало, что следующий ввод:

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

произвел этот вывод:

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

Решением было добавить следующее правило к замените <br/> s на новые строки:

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

Извините, что потратил ваше время.

...