10.5. Schachtelungstiefe von Bookmarks

Ausgangssituation

Ein Unternehmen hat für seine PDF-Dokumente einen Styleguide, der eine maximale Verschachtelungstiefe von 2 Hierarchieebenen erlaubt.

Problem

Wie kann diese Vorgabe geprüft werden?

Lösungsansatz

Die Bookmarks werden als XML-Struktur betrachtet. Aufgrund dieser Struktur wird ein geeigneter XPath-Ausdruck entwickelt.

Lösung

Aus den Bookmarks eines PDF-Dokumentes wurde mithilfe des Extraktionsprogramms ExtractBookmarks folgende XML-Struktur erzeugt:

<?xml version="1.0" encoding="UTF-8"?>
<Bookmark>
  <Title Action="GoTo" Page="1 FitH 698" Style="bold" >Bookmark to first page
    <Title Action="URI" URI="http://www.wikipedia.org/" Color="0 0 1" >
      Link to Wikipedia
    </Title>
  </Title>
</Bookmark>

Der XPath-Ausdruck soll prüfen, dass es keinen Title-Knoten gibt, der 2 oder mehr Title-Knoten als Vorgänger hat. Dann sieht der Test folgendermaßen aus:

<!--
  Testing bookmarks, one nested level allowed.
-->
<testcase name="hasBookmarks_LimitedNestedDepthTo1">
  <assertThat testDocument="bookmarks/bookmarksWithPdfOutline.pdf">
    <hasBookmarks>
      <matchingXPath expr="count(//Title[count(ancestor::Title) > 1]) = 0" />
    </hasBookmarks>
  </assertThat>
</testcase>

<!--
  Important hint:
  The value of the attribute 'expr' is used as a parameter of type String.
  So you have to use double quotes as outer quotes for the attribute. 
  Otherwise you get a compile error after the transformation from XML to Java.  
-->