【问题标题】:Using XSLT to edit tags in a multilevel bulleted list使用 XSLT 编辑多级项目符号列表中的标签
【发布时间】:2017-08-30 07:54:57
【问题描述】:

以下是一些带有多级无序列表的简单 XML,我想将其导入 Adob​​e 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 标记。 (例如 &lt;h1&gt; 可以分配给我的 Header 1 段落样式)。这在大多数情况下都很好。但是,我的问题出现在多级/嵌套项目符号列表中。

要在 InDesign 中制作多级项目符号,我为每个级别的项目符号设置了单独的段落样式。下面是我希望无序列表在 InDesign 中的显示方式,括号中是相关的段落样式。

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

问题在于 InDesign 无法区分多级项目符号。如您所料,如果我将&lt;li&gt; 分配给其中一个项目符号段落样式,则所有项目符号都将变为该级别,如果我将样式分配给&lt;ul&gt; 也是如此。

我想使用 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 中的适当段落样式(例如,&lt;li1&gt; 可以映射到 TEXT:bullet 1,&lt;li2&gt; 映射到 TEXT:bullet 2 等等)。我对 XML 和 XSLT 还很陌生,因此我们将不胜感激。

【问题讨论】:

    标签: xml xslt adobe-indesign


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,解释得也很好!属性值模板是一种有趣的方法。不幸的是,即使这完全符合我的要求,InDesign 仍然对 XML 不满意。这与 XML 文件中存在的 unicode 有关(特别是 ,段落返回)。 XSLT 可以用来编辑 XML 文件中的 unicode 吗?
    • 您可能会在包含该字符的文本节点上使用translate 函数将其删除。 &lt;xsl:value-of select="translate(., '&amp;#x2029;', '')" /&gt;.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2011-12-02
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多