XSLT для удаления определенного юникода, содержащегося в неупорядоченном списке - PullRequest
0 голосов
/ 18 июня 2019

У меня есть какой-то XML, который я импортирую в InDesign. Проблема возникает с многоуровневыми маркированными списками, которые неправильно форматируются в документе.

Проблема проще визуализировать в InDesign. На двух скриншотах показан один и тот же импортированный XML в разных представлениях. Выделенные красные области - это те части, которые я хочу удалить с помощью XSLT (вызванные нежелательным Unicode 
).

Вид редактора историй InDesign

Вид компоновки InDesign

Вот импортированный XML:

<?xml version="1.0" encoding="UTF-8"?>
<STORY StoryCode="454789" DatePublished="18/06/2019 07:50">
   <Story_text>
      <!--?xml version="1.0" encoding="UTF-8" standalone="yes"?-->
      <h2>List 1</h2>
      <ul>
         <li>
            level 1
            <ul>
               <li>level 2</li>
               <li>level 2</li>
            </ul>
         </li>
         <li>level 1</li>
         <li>
            level 1
            <ul>
               <li>
                  level 2
                  <ul>
                     <li>level 3</li>
                  </ul>
               </li>
            </ul>
         </li>
         <li>level 1</li>
         <li>level 1</li>

      </ul>
   </Story_text>
</STORY>

А вот мой нынешний XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="no" />

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

    <!-- #2 assigns each level of bullet to li1, li2, li3 etc. -->
    <xsl:template match="ul/li">
        <xsl:element name="li{count(ancestor::li) + 1}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>

    <!-- #3 insert paragraph separator after ul elements with li parent -->
    <xsl:template match="li/ul">
        <xsl:copy><xsl:text>&#8233;</xsl:text><xsl:apply-templates/></xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Шаблон № 2 необходим для того, чтобы каждый уровень маркера можно было сопоставить с определенным стилем абзаца InDesign (например, со стилем маркера 1, стилем маркера 2 и т. Д.). Привет пользователю Тим С за помощь.

Шаблон № 3 необходим, чтобы исправить причуду, когда первая пуля из списка уровня 2 или выше не появляется в новой строке. Поскольку InDesign допускает применение только одного стиля абзаца к новой строке, без этого шаблона маркеры разных уровней появляются в одной строке и отображаются в одном стиле абзаца ( изображение результата InDesign без шаблона # 3 ).

Я пробовал следующий XSLT:

<xsl:template match="ul/li/ul/text()">
    <xsl:value-of select="translate(., '&#8233;', '')" />
    <xsl:apply-templates/>
</xsl:template>

[Это сближается, но в конечном итоге терпит неудачу, если есть несколько последовательных пуль одного и того же уровня ( см. Изображение редактора историй InDesign ). Я думаю, потому что все разделители абзацев, содержащиеся в <ul> ... </ul>, удаляются, а не те, которые я хочу удалить.]

И

<xsl:template match="ul/li/ul/text()">
   <xsl:value-of select="substring(., 1, string-length(.)-X)" />
</xsl:template>

[Если X ≤2, то ничего не меняется, когда X> 2, результат такой же, как и в предыдущем методе]

Я думаю, что я хочу достичь, если <ul> ... </ul> (хотя бы с одним родителем <ul>) содержит ≥2 &#8233;, удалить окончательный &#8233;, но я не могу понять как перевести это в XSLT.

Я бы очень признателен за любую помощь / указатели в правильном направлении.

EDIT

Я понимаю, что приведенный выше пример XML несколько вводит в заблуждение с точки зрения разрывов строк, поэтому здесь приведено более точное описание (включая разделитель параграфа &#8233;):

<?xml version="1.0" encoding="utf-8" standalone="yes"?><STORY StoryCode="454789" DatePublished="18/06/2019 07:50"><Headline>Bullet XML test SO</Headline>&#8233;
<Standfirst><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><p>placeholder</p></Standfirst>&#8233;
<Story_text><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><h2>List 1</h2>&#8233;
<ul><li>level 1<ul><li>level 2</li>&#8233;
<li>level 2</li>&#8233;
</ul></li>&#8233;
<li>level 1</li>&#8233;
<li>level 1<ul><li>level 2<ul><li>level 3</li>&#8233;
</ul></li>&#8233;
</ul></li>&#8233;
<li>level 1</li>&#8233;
<li>level 1</li>&#8233;
</ul></Story_text>&#8233;
</STORY>

Вот XML после преобразования с моим текущим XSLT, я отметил разделители абзацев, которые я хочу удалить.

<?xml version="1.0" encoding="utf-8" standalone="yes"?><STORY StoryCode="454789" DatePublished="18/06/2019 07:50"><Headline>Bullet XML test SO</Headline>&#8233;
<Standfirst><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><p>placeholder</p></Standfirst>&#8233;
<Story_text><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><h2>List 1</h2>&#8233;
<ul><li1>level 1<ul>&#8233;
<li2>level 2</li2>&#8233;
<li2>level 2</li2>&#8233;
</ul></li1>&#8233;    [TO DELETE]
<li1>level 1</li1>&#8233;
<li1>level 1<ul>&#8233;
<li2>level 2<ul>&#8233;
<li3>level 3</li3>&#8233;
</ul></li2>&#8233;    [TO DELETE]
</ul></li1>&#8233;    [TO DELETE]
<li1>level 1</li1>&#8233;
<li1>level 1</li1>&#8233;
</ul></Story_text>&#8233;
</STORY>
...