使用XSLT在多级符号列表
问题描述:
下面编辑标签是一些简单的XML与多级无序列表,我想导入到Adobe InDesign中:使用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>
<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中出现的方式,括号中的相关段落样式。
- 级别1(TEXT:子弹1)
- 级别2(TEXT:子弹2)
- 级别3(TEXT:弹头3)
- 级别4(TEXT: bullet 4)
- 级别3(TEXT:弹头3)
- 级别2(TEXT:子弹2)
- 级别1(TEXT:子弹1)
- 级别2(TEXT:子弹2)
- 级别1(TEXT:子弹1)
问题是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:子弹1,<li2>
映射到TEXT:bullet 2等等)。我对XML和XSLT相当陌生,所以任何帮助都会受到大量赞赏。
答
你应该先用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>
太感谢你了,真的也很好解释!属性值模板是一个有趣的方法。不幸的是,尽管这确实如我所愿,但InDesign仍然不满意XML。这与XML文件中存在的unicode有关(特别是,段落返回)。可以使用XSLT编辑XML文件中的unicode吗? – lightworks
您可以使用包含该字符的文本节点上的'translate'功能将其去掉。 ''。 –