2017-08-30 2 views
0

Hier finden Sie einige einfachen XML zu bearbeiten, die ich in Adobe InDesign importieren möchte:XSLT Verwenden von Tags in einer Multi-Level-Aufzählungsliste mit einer Multi-Level-ungeordneten Liste

<?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 ermöglicht es Ihnen, seine Absatzvorlagen zur Karte zu XML-Tags (z. B. <h1> kann meinem Absatzformat Absatz 1 zugewiesen werden). Das ist in den meisten Fällen in Ordnung; Mein Problem tritt jedoch bei Multilevel/verschachtelte Aufzählungslisten auf.

Um mehrstufige Aufzählungszeichen in InDesign zu erstellen, habe ich separate Absatzvorlagen für jede Ebene von Aufzählungszeichen. Unten möchte ich, dass die ungeordnete Liste in InDesign mit den entsprechenden Absatzstilen in Klammern angezeigt wird.

  • Ebene 1 (TEXT: bullet 1)
    • 2 (TEXT: bullet 2)
      • 3 (TEXT: Kugel 3)
        • 4 (TEXT: bullet 4)
  • Ebene 1 (TEXT: bullet 1)
    • 2 (TEXT: bullet 2)
  • Ebene 1 (TEXT: bullet 1)

Das Problem ist InDesign hat keine Möglichkeit, zwischen mehrstufigen Geschossen zu unterscheiden. Wie Sie erwarten würden, wenn ich einen der Bullet-Absatz-Stile <li> zuweisen, werden alle Aufzählungszeichen diese Ebene werden, gleich, wenn ich den Stil <ul> zuweisen.

Ich mag XSLT zur Ausgabe verwenden, um die folgenden:

<?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> 

Dies ermöglicht es mir, die Kugel Ebene in dem entsprechenden Absatzformat in InDesign zur Karte (zB <li1> zu TEXT zugeordnet werden kann: bullet 1, <li2> zugeordnet TEXT: bullet 2 und so weiter). Ich bin ziemlich neu in XML und XSLT, also jede Hilfe würde massiv geschätzt werden.

Antwort

5

Sie sollten zunächst mit der XSLT-Identity-Vorlage kopieren Sie alle Elemente über unverändert ...

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

Dann alles, was Sie brauchen, ist hinzuzufügen, eine übergeordnete Vorlage, die li übereinstimmt und gibt ein neues Element mit dem beginnen Anzahl der Vorfahren im Namen stattdessen.

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

Beachten Sie die geschweiften Klammern zeigen eine Attribute Value Template, die einen Ausdruck angeben, zu bewerten, anstatt Ausgabe wahrsten Sinne des Wortes.

Versuchen Sie, diese 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

Danke soviel, wirklich gut zu erklären! Die Attributwertvorlage ist eine interessante Methode. Leider, obwohl dies genau das tut, was ich wollte, ist InDesign immer noch nicht zufrieden mit dem XML. Es hat etwas mit Unicode in der XML-Datei zu tun (speziell , Absatz zurück). Kann XSLT zum Bearbeiten von Unicode in einer XML-Datei verwendet werden? – lightworks

+0

Sie könnten die Funktion 'translate' auf Textknoten, die das Zeichen enthalten, möglicherweise verwenden, um sie zu entfernen. ''. –

Verwandte Themen