XSLT删除无序列表中包含的特定unicode

时间:2019-06-18 10:41:33

标签: xml xslt xpath unicode adobe-indesign

我有一些要导入InDesign的XML。多级项目符号列表会引起问题,它们在文档中的格式不正确。

该问题在InDesign中更容易可视化。这两个屏幕截图以不同的视图显示了相同的导入XML。突出显示的红色区域是我要通过XSLT删除的部分(由不需要的unicode 
引起)。

InDesign story editor view

InDesign layout view

这是导入的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样式等)。在这里向用户Tim C大喊大叫。

必须使用模板#3来解决一个奇怪的问题,即第2级或更高级别列表中的第一个项目符号不会出现在新行上。因为InDesign仅允许每行添加一个段落样式,所以没有此模板,因此不同级别的项目符号会出现在同一行中,并映射到相同的段落样式(image of InDesign result without template #3)。

我尝试了以下XSLT:

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

[这很接近,但如果连续有多个相同级别的子弹(see InDesign story editor image),最终将失败。我猜是因为<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。

如果能向正确的方向提供帮助/指针,我将深表感谢。

编辑

我意识到上面导入的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>

这是用当前的XSLT转换后的XML,我标记了要删除的段落分隔符。

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

0 个答案:

没有答案