以下是一些带有多级无序列表的简单XML,我想将其导入Adobe InDesign:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<STORY>
<Headline>XML test</Headline>
<Standfirst><p>Standfirst</p></Standfirst>
<Story_text>
<h1>Heading 1</h1>
<p>para text</p>
<ul>
<li>
level 1
<ul>
<li>
level 2
<ul>
<li>
level 3
<ul>
<li>
level 4
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
level 1
<ul>
<li>
level 2
</li>
</ul>
</li>
<li>
level 1
</li>
</ul>
</Story_text>
</STORY>
InDesign允许您将其段落样式映射到XML标记。 (例如<h1>
可以分配给我的标题1段落样式)。这在很大程度上是好的;但是,我的问题出现在多级/嵌套项目符号列表中。
要在InDesign中执行多级项目符号,我为每个级别的项目符号都有单独的段落样式。以下是我希望无序列表出现在InDesign中的方式,括号中的相关段落样式。
问题是InDesign无法区分多级子弹。正如您所期望的那样,如果我将<li>
指定给其中一个项目符号段落样式,则所有项目符号都将成为该级别,如果我将样式指定给<ul>
,则相同。
我想使用XSLT输出以下内容:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<STORY>
<Headline>XML test</Headline>
<Standfirst><p>Standfirst</p></Standfirst>
<Story_text>
<h1>Heading 1</h1>
<p>para text</p>
<ul>
<li1>
level 1
<ul>
<li2>
level 2
<ul>
<li3>
level 3
<ul>
<li4>
level 4
</li4>
</ul>
</li3>
</ul>
</li2>
</ul>
</li1>
<li1>
level 1
<ul>
<li2>
level 2
</li2>
</ul>
</li1>
<li1>
level 1
</li1>
</ul>
</Story_text>
</STORY>
这将允许我将子弹级别映射到InDesign中的相应段落样式(例如<li1>
可以映射到TEXT:bullet 1,<li2>
映射到TEXT:bullet 2等等) 。我是XML和XSLT的新手,所以任何帮助都会受到大力赞赏。
答案 0 :(得分:5)
首先应该使用XSLT标识模板来复制所有未更改的元素...
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
然后你需要的是添加一个匹配li
的覆盖模板,并输出一个新元素,其中包含名称中祖先的数量。
<xsl:template match="li">
<xsl:element name="li{count(ancestor::li) + 1}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
请注意,花括号表示Attribute Value Template,表示要计算的表达式,而不是按字面输出。
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="no" />
<xsl:template match="li">
<xsl:element name="li{count(ancestor::li) + 1}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>