使用 XSLT 编辑多级项目符号列表中的标签
Using XSLT to edit tags in a multilevel bulleted list
以下是一些简单的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 段落样式)。这在大多数情况下都很好;但是,我的问题出现在 multilevel/nested 项目符号列表中。
为了在 InDesign 中制作多级项目符号,我为每一级项目符号设置了单独的段落样式。下面是我希望无序列表在 InDesign 中的显示方式,相关段落样式在括号中。
- 1 级(文本:项目符号 1)
- 2 级(文本:项目符号 2)
- 3 级(文本:项目符号 3)
- 4 级(文本:项目符号 4)
- 1 级(文本:项目符号 1)
- 2 级(文本:项目符号 2)
- 1 级(文本:项目符号 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:项目符号 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>
以下是一些简单的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 段落样式)。这在大多数情况下都很好;但是,我的问题出现在 multilevel/nested 项目符号列表中。
为了在 InDesign 中制作多级项目符号,我为每一级项目符号设置了单独的段落样式。下面是我希望无序列表在 InDesign 中的显示方式,相关段落样式在括号中。
- 1 级(文本:项目符号 1)
- 2 级(文本:项目符号 2)
- 3 级(文本:项目符号 3)
- 4 级(文本:项目符号 4)
- 3 级(文本:项目符号 3)
- 2 级(文本:项目符号 2)
- 1 级(文本:项目符号 1)
- 2 级(文本:项目符号 2)
- 1 级(文本:项目符号 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:项目符号 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>