代码之家  ›  专栏  ›  技术社区  ›  lightworks

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

  •  0
  • lightworks  · 技术社区  · 7 年前

    下面是一些简单的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段落样式)。这在很大程度上是好的;然而,我的问题出现在多级/嵌套项目符号列表中。

    • 级别1(文本:项目符号1)
      • 级别2(文本:项目符号2)
        • 级别3(文本:项目符号3)
    • 级别1(文本:项目符号1)
      • 级别2(文本:项目符号2)

    问题是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> <li2> 映射到文本:项目符号2等)。我对XML和XSLT很陌生,因此非常感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Tim C    7 年前

    您应该首先从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>