我有一些要导入InDesign的XML。多级项目符号列表会引起问题,它们在文档中的格式不正确。
该问题在InDesign中更容易可视化。这两个屏幕截图以不同的视图显示了相同的导入XML。突出显示的红色区域是我要通过XSLT删除的部分(由不需要的unicode 

引起)。
这是导入的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>
</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(., '
', '')" />
<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

,则删除最后一个

,但我不知道如何将其转换为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>

<Standfirst><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><p>placeholder</p></Standfirst>

<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转换后的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>

<Standfirst><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><p>placeholder</p></Standfirst>

<Story_text><!--?xml version="1.0" encoding="UTF-8" standalone="yes"?--><h2>List 1</h2>

<ul><li1>level 1<ul>

<li2>level 2</li2>

<li2>level 2</li2>

</ul></li1>
 [TO DELETE]
<li1>level 1</li1>

<li1>level 1<ul>

<li2>level 2<ul>

<li3>level 3</li3>

</ul></li2>
 [TO DELETE]
</ul></li1>
 [TO DELETE]
<li1>level 1</li1>

<li1>level 1</li1>

</ul></Story_text>

</STORY>