2017-08-30 40 views
0

下面编辑标签是一些简单的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)
  • 级别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相当陌生,所以任何帮助都会受到大量赞赏。

回答

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> 
+0

太感谢你了,真的也很好解释!属性值模板是一个有趣的方法。不幸的是,尽管这确实如我所愿,但InDesign仍然不满意XML。这与XML文件中存在的unicode有关(特别是,段落返回)。可以使用XSLT编辑XML文件中的unicode吗? – lightworks

+0

您可以使用包含该字符的文本节点上的'translate'功能将其去掉。 ''。 –