Xml 使用XSLT编辑多级项目符号列表中的标记
以下是一些简单的XML,其中包含多级无序列表,我希望将其导入Adobe InDesign:Xml 使用XSLT编辑多级项目符号列表中的标记,xml,xslt,adobe-indesign,Xml,Xslt,Adobe Indesign,以下是一些简单的XML,其中包含多级无序列表,我希望将其导入Adobe InDesign: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <STORY> <Headline>XML test</Headline> <Standfirst><p>Standfirst</p></Standfirst> <Story_text&
<?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>
XML测试
第一名
标题1
准文本
-
一级
-
二级
-
三级
-
四级
-
一级
-
二级
-
一级
InDesign允许您将其段落样式映射到XML标记。(例如,
可以指定给我的标题1段落样式)。这在很大程度上是好的;但是,我的问题出现在多级/嵌套项目符号列表中
为了在InDesign中实现多级项目符号,我为每一级项目符号提供了单独的段落样式。下面是我希望无序列表在InDesign中的显示方式,相关段落样式在括号中
- 级别1(文本:项目符号1)
- 第2级(文本:项目符号2)
- 第3级(文本:项目符号3)
- 第4级(文本:项目符号4)
- 第3级(文本:项目符号3)
- 第2级(文本:项目符号2)
- 级别1(文本:项目符号1)
- 第2级(文本:项目符号2)
- 级别1(文本:项目符号1)
指定给其中一个项目符号段落样式,则所有项目符号都将成为该级别,如果我将样式指定给
,则相同
我想使用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>
XML测试
第一名
标题1
准文本
一级
二级
三级
四级
一级
二级
一级
这将允许我在InDesign中将项目符号级别映射到适当的段落样式(例如,
可以映射到文本:项目符号1,
映射到文本:项目符号2等等)。我对XML和XSLT非常陌生,因此非常感谢您提供的任何帮助。您应该首先从XSLT标识模板开始,将所有元素复制到XML和XSLT中
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl: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>
您应该首先从XSLT标识模板开始,将所有元素复制到未更改的
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl: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吗?您可以在包含字符的文本节点上使用translate
函数将其删除<代码>。非常感谢,解释得也很好!属性值模板是一种有趣的方法。不幸的是,尽管这正是我想要它做的,InDesign仍然对XML不满意。这与XML文件中的unicode有关(特别是段落返回)。XSLT可以用于编辑XML文件中的unicode吗?您可以在包含字符的文本节点上使用translate
函数将其删除<代码>。