使用XSLT编辑多级项目符号列表中的标记

0 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>
<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>
Run Code Online (Sandbox Code Playgroud)

InDesign允许您将其段落样式映射到XML标记.(例如<h1>可以分配给我的Header 1段样式).这在很大程度上是好的; 但是,我的问题出现在多级/嵌套项目符号列表中.

要在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>
Run Code Online (Sandbox Code Playgroud)

这将允许我将子弹级别<li1>映射到InDesign中的相应段落样式(例如,可以映射到TEXT:项目符号1,<li2>映射到TEXT:项目符号2,依此类推).我是XML和XSLT的新手,所以任何帮助都会受到大力赞赏.

Tim*_*m C 5

您应该首先使用XSLT标识模板来复制所有未更改的元素...

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

然后,您只需要添加一个覆盖模板,该模板匹配li并输出一个名为祖先数的新元素.

<xsl:template match="li">
  <xsl:element name="li{count(ancestor::li) + 1}">
        <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

请注意,花括号表示属性值模板,它指示要计算的表达式,而不是字面输出.

试试这个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>
Run Code Online (Sandbox Code Playgroud)