2017-08-30 90 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'功能將其去掉。 ''。 –