<?xml version="1.0" encoding="iso-8859-1"?>
<!-- $Id: REC-xpath-19991116.xml,v 1.1 1999/11/16 15:01:35 hugo Exp $ -->
<!-- vorher:
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.0//EN"
                      "/XML/1998/06/xmlspec-v20.dtd" [
-->
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.1//EN" 
                      "trans-xmlspec-v10.dtd" [
<!--
<!ENTITY XML "http://www.w3.org/TR/REC-xml">
<!ENTITY XMLNames "http://www.w3.org/TR/REC-xml-names">
-->
<!ENTITY XML "http://www.edition-w3c.de/TR/REC-xml">
<!ENTITY XMLNames "http://www.edition-w3c.de/TR/REC-xml-names">
<!ENTITY year "1999">
<!ENTITY month "November">
<!ENTITY MM "11">
<!ENTITY day "16">
<!ENTITY DD "16">
<!ENTITY YYYYMMDD "&year;&MM;&DD;">
<!ENTITY LEV "REC">

<!ENTITY TRANSLOC "http://www.obqo.de/w3c-trans">
<!ENTITY EDW3CDE "http://www.edition-w3c.de/TR">
<!ENTITY AUTHORMAIL "ob@obqo.de">

<!ENTITY tyear "2002">
<!ENTITY tmonth "Februar">
<!ENTITY tMM "02">
<!ENTITY tday "26">
<!ENTITY tDD "26">
<!--
<!ENTITY tyear "0000">
<!ENTITY tmonth "Monat">
<!ENTITY tMM "00">
<!ENTITY tday "00">
<!ENTITY tDD "00">
-->
<!ENTITY tYYYYMMDD "&tyear;&tMM;&tDD;">
<!ENTITY XSLTSPEC "http://www.edition-w3c.de/TR/xslt">
<!ENTITY ERRATA "http://www.w3.org/1999/11/REC-xpath-19991116-errata">
<!ENTITY ERRATALOC "<loc href='&ERRATA;'>&ERRATA;</loc>">

<!-- DTD customizations -->
<!-- bereits Bestandteil der xmlspec-v21.dtd !
<!ELEMENT proto (arg*)>
<!ATTLIST proto
  name NMTOKEN #REQUIRED
  return-type (number|string|boolean|node-set|object) #REQUIRED
>
<!ELEMENT arg EMPTY>
<!ATTLIST arg
  type (number|string|boolean|node-set|object) #REQUIRED
  occur (opt|rep) #IMPLIED
>
<!ELEMENT function (#PCDATA)>
<!ENTITY % local.illus.class "|proto">
<!ENTITY % local.tech.class "|function">
-->

<!-- DTD-Erweiterung um xfunction -->
<!ELEMENT xfunction (#PCDATA)>
<!ATTLIST xfunction href CDATA #REQUIRED>
<!ENTITY % local.tech.class "| xfunction">

<!ATTLIST spec xml:lang NMTOKEN #FIXED "de">
<!ENTITY ndash            "&#x02013;" ><!--=en dash -->
]>
<spec>
<header>
<title>XML Path Language (XPath)</title>
<version>Version 1.0</version>
<w3c-designation>&LEV;-xpath-&YYYYMMDD;</w3c-designation>
<!-- ORIG
<w3c-doctype>W3C Recommendation</w3c-doctype>
-->
<w3c-doctype>Empfehlung des W3C</w3c-doctype>
<pubdate><day>&day;</day><month>&month;</month><year>&year;</year></pubdate>
<publoc>
<loc href="http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;"
          >http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;</loc>
<loc role="available-format"
href="http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;.xml">XML</loc>
<loc role="available-format"
href="http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;.html">HTML</loc>
<!--
<loc href="http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;.pdf"
          >http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;.pdf</loc>
-->
</publoc>
<latestloc>
<loc href="http://www.w3.org/TR/xpath"
          >http://www.w3.org/TR/xpath</loc>
</latestloc>
<prevlocs>
<loc href="http://www.w3.org/TR/1999/PR-xpath-19991008"
          >http://www.w3.org/TR/1999/PR-xpath-19991008</loc>
<loc href="http://www.w3.org/1999/08/WD-xpath-19990813"
          >http://www.w3.org/1999/08/WD-xpath-19990813</loc>
<loc href="http://www.w3.org/1999/07/WD-xpath-19990709"
          >http://www.w3.org/1999/07/WD-xpath-19990709</loc>
<loc href="http://www.w3.org/TR/1999/WD-xslt-19990421"
          >http://www.w3.org/TR/1999/WD-xslt-19990421</loc>
</prevlocs>
<authlist>
<author>
<name>James Clark</name>
<email href="mailto:jjc@jclark.com">jjc@jclark.com</email>
</author>
<author>
<name>Steve DeRose</name>
<affiliation>Inso Corp. and Brown University</affiliation>
<email href="mailto:Steven_DeRose@Brown.edu">Steven_DeRose@Brown.edu</email>
</author>
</authlist>

<status>

<!-- ORIG
<p>This document has been reviewed by W3C Members and other interested
parties and has been endorsed by the Director as a W3C <loc
href="http://www.w3.org/Consortium/Process/#RecsW3C">Recommendation</loc>. It
is a stable document and may be used as reference material or cited as
a normative reference from other documents. W3C's role in making the
Recommendation is to draw attention to the specification and to
promote its widespread deployment. This enhances the functionality and
interoperability of the Web.</p>
-->
<p>Dieses Dokument wurde von Mitgliedern des W3C und anderen 
Interessierten geprüft und vom Direktor als <loc
href="http://www.w3.org/Consortium/Process/#RecsW3C">W3C-Empfehlung</loc>
gebilligt. Es ist ein abgeschlossenes Dokument und darf als 
Referenzmaterial verwendet oder als normative Referenz von einem 
anderen Dokument zitiert werden. Die Rolle des W3C bei der Erstellung 
dieser Empfehlung ist es, die Spezifikation bekannt zu machen und ihre 
breite Anwendung zu fördern. Dies erhöht die Funktionsfähigkeit und 
Interoperabilität des Web.</p>

<!-- ORIG
<p>The list of known errors in this specification is available at
<loc href="http://www.w3.org/&year;/&MM;/&LEV;-xpath-&YYYYMMDD;-errata"
>http://www.w3.org/&year;/&MM;/&LEV;-xpath-&YYYYMMDD;-errata</loc>.</p>
-->
<p>Die Liste der bekannten Fehler in dieser Spezifikation ist unter
<loc href="http://www.w3.org/&year;/&MM;/&LEV;-xpath-&YYYYMMDD;-errata"
>http://www.w3.org/&year;/&MM;/&LEV;-xpath-&YYYYMMDD;-errata</loc>
verfügbar.</p>

<!-- ORIG
<p>Comments on this specification may be sent to <loc
href="mailto:www-xpath-comments@w3.org"
>www-xpath-comments@w3.org</loc>; <loc
href="http://lists.w3.org/Archives/Public/www-xpath-comments">archives</loc>
of the comments are available.</p>
-->
<p>Anmerkungen zu dieser Spezifikation können an <loc
href="mailto:www-xpath-comments@w3.org"
>www-xpath-comments@w3.org</loc> geschickt werden; alle Anmerkungen
sind in einem <loc
href="http://lists.w3.org/Archives/Public/www-xpath-comments">Archiv</loc>
verfügbar.</p>

<!-- ORIG
<p>The English version of this specification is the only normative
version. However, for translations of this document, see <loc
href="http://www.w3.org/Style/XSL/translations.html"
>http://www.w3.org/Style/XSL/translations.html</loc>.</p>
-->
<p>Die englische Version dieser Spezifikation ist die einzig normative 
Version. Allerdings werden Übersetzungen dieses Dokuments unter
<loc href="http://www.w3.org/Style/XSL/translations.html"
>http://www.w3.org/Style/XSL/translations.html</loc> aufgeführt.</p>

<!-- ORIG
<p>A list of current W3C Recommendations and other technical documents
can be found at <loc
href="http://www.w3.org/TR">http://www.w3.org/TR</loc>.</p>
-->
<p>Aktuelle W3C-Empfehlungen und weitere technische Dokumente sind
unter <loc href="http://www.w3.org/TR">http://www.w3.org/TR</loc>
zu finden.</p>

<!-- ORIG
<p>This specification is joint work of the XSL Working Group and the
XML Linking Working Group and so is part of the <loc
href="http://www.w3.org/Style/Activity">W3C Style activity</loc> and
of the <loc href="http://www.w3.org/XML/Activity">W3C XML
activity</loc>.</p>
-->
<p>Diese Spezifikation ist das Ergebnis der gemeinsamen Arbeit der
XSL- und der XML-Linking-Arbeitsgruppen und damit Teil der <loc
href="http://www.w3.org/Style/Activity">W3C Style Activity</loc> und
der <loc href="http://www.w3.org/XML/Activity">W3C XML
Activity</loc>.</p>

</status>

<!-- ORIG
<abstract><p>XPath is a language for addressing parts of an XML
document, designed to be used by both XSLT and
XPointer.</p></abstract>
-->
<abstract><p>Die Sprache XPath dient zur Adressierung von Teilen eines
XML-Dokuments. Sie wurde für die Verwendung sowohl in XSLT als auch in 
XPointer entworfen.</p></abstract>

<langusage>
<!-- ORIG
<language id="EN">English</language>
-->
<language id="de">Deutsch</language>
<language id="ebnf">EBNF</language>
</langusage>
<revisiondesc>
<slist>
<!-- ORIG
<sitem>See RCS log for revision history.</sitem>
-->
<sitem>Siehe die RCS-Logdaten für Revisionen.</sitem>
</slist>
</revisiondesc>
</header>

<!-- neu: -->
<transheader>
<version>Version 1.0</version>
<pubdate><day>&tday;</day><month>&tmonth;</month><year>&tyear;</year></pubdate>
<notice>
<p>
Dies ist die deutsche Übersetzung der W3C-Empfehlung "XML Path Language
(XPath)" vom 16. November 1999. Bitte beachten Sie, dass dieses Dokument
Übersetzungsfehler enthalten kann. Die normative englische Version
des Dokuments befindet sich unter
<loc href="http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;"
          >http://www.w3.org/TR/&year;/&LEV;-xpath-&YYYYMMDD;</loc>
</p><p>
Bitte schicken Sie Fehler in dieser Übersetzung oder 
Verbesserungsvorschläge an den Übersetzer.
</p>
</notice>
<publoc>
<loc href="&TRANSLOC;/xpath-de-&tYYYYMMDD;"
          >&TRANSLOC;/xpath-de-&tYYYYMMDD;</loc>
<loc href="&EDW3CDE;/1999/REC-xpath-&YYYYMMDD;"
          >&EDW3CDE;/1999/REC-xpath-&YYYYMMDD;</loc>
<loc role="available-format"
href="&TRANSLOC;/xpath-de-&tYYYYMMDD;/xpath-de.xml">XML</loc>
<loc role="available-format"
href="&TRANSLOC;/xpath-de-&tYYYYMMDD;/index.html">HTML</loc>
<!--
<loc role="available-format"
href="&TRANSLOC;/xpath-de-&tYYYYMMDD;/xpath-trans.html">HTML deutsch/englisch</loc>
-->
</publoc>
<latestloc>
<loc href="&TRANSLOC;/xpath-de"
          >&TRANSLOC;/xpath-de</loc>
<loc href="&EDW3CDE;/xpath"
          >&EDW3CDE;/xpath</loc>
</latestloc>
<prevlocs>
<loc href="&TRANSLOC;/xpath-de-20010910"
          >&TRANSLOC;/xpath-de-20010910</loc>
</prevlocs>
<authlist>
<author>
<name>Oliver Becker</name>
<email href="mailto:&AUTHORMAIL;">&AUTHORMAIL;</email>
</author>
</authlist>
<copyright>
<p> 
Dieses Dokument ist urheberrechtlich geschützt, Copyright © 1999&ndash;2002
W3C® (MIT, INRIA, Keio), alle Rechte vorbehalten. Die Rechte an dieser 
Übersetzung liegen beim Übersetzer, Copyright © 2002 Oliver Becker.
</p>         
</copyright>
<revisiondesc>
<p>erste Übersetzung</p>
</revisiondesc>
</transheader>

<body>

<div1 id="intro">
<!-- ORIG
<head>Introduction</head>
-->
<head>Einleitung</head>

<!-- ORIG
<p>XPath is the result of an effort to provide a common syntax and
semantics for functionality shared between XSL Transformations <bibref
ref="XSLT"/> and XPointer <bibref ref="XPTR"/>.  The primary purpose
of XPath is to address parts of an XML <bibref ref="XML"/> document.
In support of this primary purpose, it also provides basic facilities
for manipulation of strings, numbers and booleans.  XPath uses a
compact, non-XML syntax to facilitate use of XPath within URIs and XML
attribute values.  XPath operates on the abstract, logical structure
of an XML document, rather than its surface syntax.  XPath gets its
name from its use of a path notation as in URLs for navigating through
the hierarchical structure of an XML document.</p>
-->
<p>XPath ist das Ergebnis der Bemühungen, eine gemeinsame Syntax und
Semantik für jene Funktionen bereitzustellen, die sowohl von XSL 
Transformations <bibref ref="XSLT"/> als auch von XPointer
<bibref ref="XPTR"/> genutzt werden. Die primäre Aufgabe von XPath
besteht in der Adressierung von Teilen eines XML-Dokuments
<bibref ref="XML"/>. Zur Unterstützung dieser Aufgabe werden
außerdem einfache Hilfsmittel für die Manipulation von Zeichenketten,
Zahlen und booleschen Werten bereitgestellt. XPath benutzt eine 
kompakte Nicht-XML-Syntax, um die Verwendung von XPath-Ausdrücken 
innerhalb von URIs und XML-Attributen zu erleichtern. XPath operiert 
auf der abstrakten, logischen Struktur eines XML-Dokuments, nicht auf
seiner äußerlichen Syntax. Seinen Namen erhält XPath durch die 
Verwendung einer auch in URLs genutzten Pfad-Notation (path), mit
der sich durch die hierarchische Struktur eines XML-Dokuments 
navigieren lässt.</p>

<!-- ORIG
<p>In addition to its use for addressing, XPath is also designed so
that it has a natural subset that can be used for matching (testing
whether or not a node matches a pattern); this use of XPath is
described in <xspecref href="http://www.w3.org/TR/WD-xslt#patterns"
>XSLT</xspecref>.</p>
-->
<p>Neben der Verwendung für die Adressierung wurde XPath so gestaltet,
dass eine natürliche Teilmenge davon zum Matching (Testen, ob ein 
Knoten auf ein Muster passt) genutzt werden kann. Diese Anwendung von 
XPath ist in <xspecref
href="http://www.edition-w3c.de/TR/xslt#patterns">XSLT</xspecref>
beschrieben.</p>

<transnote>
<p>
Diese Teilmenge wird in XSLT Muster (pattern) genannt. Obwohl diese 
Muster durch eine eigene Grammatik definiert werden, ist jedes Muster 
auch ein XPath-Ausdruck.
</p><p>
Neben XSLT und XPointer existieren weitere Spezifikationen, die XPath 
nutzen. Als Beispiel sei hier der Arbeitsentwurf des W3C für die 
XML-Abfragesprache XQuery <bibref ref="XQUERY" /> genannt, deren 
Syntax erweiterte XPath-Ausdrücke verwendet. 
</p>
</transnote>

<!-- ORIG
<p>XPath models an XML document as a tree of nodes.  There are
different types of nodes, including element nodes, attribute nodes and
text nodes.  XPath defines a way to compute a <termref
def="dt-string-value">string-value</termref> for each type of node.
Some types of nodes also have names.  XPath fully supports XML
Namespaces <bibref ref="XMLNAMES"/>.  Thus, the name of a node is
modeled as a pair consisting of a local part and a possibly null
namespace URI; this is called an <termref
def="dt-expanded-name">expanded-name</termref>.  The data model is
described in detail in <specref ref="data-model"/>.</p>
-->
<p>XPath modelliert ein XML-Dokument als einen Baum, der aus Knoten
besteht. Es gibt verschiedene Knotentypen, unter anderem Elementknoten,
Attributknoten und Textknoten. XPath definiert, wie der <termref
def="dt-string-value">Zeichenkettenwert</termref> für jeden Knotentyp
berechnet wird. Einige Knoten besitzen zusätzlich einen Namen.
XPath unterstützt in vollem Umfang XML-Namensräume <bibref
ref="XMLNAMES"/>. Daher wird der Name eines Knotens als ein Paar aus
einem lokalen Bestandteil und einem gegebenenfalls leeren 
Namensraum-URI modelliert &ndash; dieses wird <termref 
def="dt-expanded-name">erweiterter Name</termref> genannt. Das
Datenmodell ist detailliert in <specref ref="data-model"/> 
beschrieben.</p>

<transnote>
<p>
Zur Veranschaulichung der durch XPath modellierten Baumstruktur soll
folgendes Beispiel dienen:
</p>
<eg><![CDATA[
<?xml version="1.0"?>
<!DOCTYPE rezept SYSTEM "rezept.dtd">
<?xml-stylesheet href="style.xsl" type="text/xml"?>
<rezept>
   <zutat id="mehl">200g Mehl</zutat>
   <!-- weitere Zutaten -->
   <anleitung>
      Zuerst nehmen Sie das
      <zutat xmlns:xlink="http://www.w3.org/1999/xlink"
             xlink:type="simple" xlink:href="mehl">Mehl</zutat>
      und mischen es mit ...
   </anleitung>
</rezept>]]></eg>
<p>
Dieses recht kurze XML-Dokument besitzt bereits eine aus 23 Knoten 
bestehende Baumrepräsentation:</p>
<graphic source="images/rezept.gif" alt="Baumdarstellung"
         role="screenonly" />
<graphic source="rezept.eps" alt="Baumdarstellung" role="printonly" />
<p>
Die XML-Deklaration sowie die Dokumenttyp-Deklaration finden sich in 
der Baumdarstellung nicht wieder, auf sie kann über einen 
XPath-Ausdruck auch nicht zugegriffen werden. Alle anderen Bestandteile
des Dokuments (Wurzel, Elemente, Textinhalt, Attribute, Namensräume, 
Kommentare, Processing Instructions) werden durch entsprechende Knoten 
des Baumes repräsentiert. Die leeren Quadrate symbolisieren Textknoten,
die ausschließlich Leerraumzeichen enthalten. Inwieweit sich solcher 
Leerraum in eigenen Textknoten wiederfindet, wird von der XPath 
nutzenden Anwendung bestimmt. Schließlich sei auf die implizit zu jedem
Element gehörenden Namensraumknoten für den <code>xml</code>-Namensraum
hingewiesen.
</p><p>
Das Document Object Model <bibref ref="DOM" /> definiert ebenfalls eine 
Baumrepräsentation, die allerdings in einigen Punkten von der in XPath 
verwendeten abweicht. Auf diese Unterschiede wird innerhalb des
Kapitels <specref ref="data-model" /> eingegangen.
</p>
</transnote>

<!-- ORIG
<p>The primary syntactic construct in XPath is the expression.  An
expression matches the production <nt def="NT-Expr">Expr</nt>.  An
expression is evaluated to yield an object, which has one of the
following four basic types:</p>
-->
<p>Das primäre syntaktische Konstrukt in XPath ist der Ausdruck.
Ein Ausdruck lässt sich aus der Produktion <nt def="NT-Expr">Expr</nt>
ableiten. Die Auswertung eines Ausdrucks ergibt ein Objekt, das zu
einem der folgenden vier Grundtypen gehört:</p>

<!-- ORIG
<slist>

<sitem>node-set (an unordered collection of nodes without duplicates)</sitem>

<sitem>boolean (true or false)</sitem>

<sitem>number (a floating-point number)</sitem>

<sitem>string (a sequence of UCS characters)</sitem>

</slist>
-->
<slist>

<sitem><emph>node-set</emph> (eine ungeordnete Menge von Knoten ohne
Duplikate)</sitem>

<sitem><emph>boolean</emph> (<emph>wahr</emph> oder 
<emph>falsch</emph>)</sitem>

<sitem><emph>number</emph> (eine Gleitkommazahl)</sitem>

<sitem><emph>string</emph> (eine Zeichenkette bestehend aus 
UCS-Zeichen)</sitem>

</slist>

<transnote>
<p>
Das sind die vier Grundtypen, die XPath definiert. Tatsächlich können
darauf aufbauende Spezifikationen weitere Typen definieren, sodass die 
Auswertung eines XPath-Ausdrucks ein Objekt dieses neuen Typs ergeben 
kann. Insbesondere können im Ausdruck enthaltene Variablen Objekte 
anderer Typen aufnehmen.
</p><p>
Wie man sieht, gibt es keinen Datentyp für Knoten. Ein einzelner Knoten
kann aber als Knotenmenge (<emph>node-set</emph>) dargestellt werden, 
die genau ein Element enthält.
</p><p>
Die innerhalb von Zeichenketten erlaubten UCS-Zeichen (Universal 
Multiple-Octet Coded Character Set) sind in <bibref ref="ISO10646" /> 
bzw. <bibref ref="ISO10646-2" /> beschrieben.
</p>
</transnote>

<!-- ORIG
<p>Expression evaluation occurs with respect to a context.  XSLT and
XPointer specify how the context is determined for XPath expressions
used in XSLT and XPointer respectively.  The context consists of:</p>
-->
<p>Ein Ausdruck wird immer bezüglich eines Kontextes ausgewertet.
XSLT und XPointer spezifizieren, wie dieser Kontext bei der
Verwendung von XPath-Ausdrücken in XSLT bzw. XPointer
bestimmt wird. Der Kontext besteht aus:</p>

<!-- ORIG
<slist>

<sitem>a node (<termdef id="dt-context-node" term="Context Node">the
<term>context node</term></termdef>)</sitem>

<sitem>a pair of non-zero positive integers (<termdef
id="dt-context-position" term="Context Position">the <term>context
position</term></termdef> and <termdef id="dt-context-size"
term="Context Size">the <term>context size</term></termdef>)</sitem>

<sitem>a set of variable bindings</sitem>

<sitem>a function library</sitem>

<sitem>the set of namespace declarations in scope for the
expression</sitem>

</slist>
-->
<slist>

<sitem>einem Knoten (<termdef id="dt-context-node" 
term="Kontextknoten">dem <term>Kontextknoten</term></termdef>)</sitem>

<sitem>einem Paar von positiven ganzen Zahlen ungleich 0 (<termdef
id="dt-context-position" term="Kontextposition">der 
<term>Kontextposition</term></termdef> und <termdef 
id="dt-context-size" term="Kontextgröße">der 
<term>Kontextgröße</term></termdef>)</sitem>

<sitem>einer Menge von Variablenbelegungen</sitem>

<sitem>einer Funktionsbibliothek</sitem>

<sitem>den Namensraumdeklarationen, in deren Gültigkeitsbereich der
Ausdruck liegt</sitem>

</slist>

<!-- ORIG
<p>The context position is always less than or equal to the
context size.</p>
-->
<p>Die Kontextposition ist immer kleiner oder gleich der
Kontextgröße.</p>

<!-- ORIG
<p>The variable bindings consist of a mapping from variable names to
variable values.  The value of a variable is an object, which can be of
any of the types that are possible for the value of an expression,
and may also be of additional types not specified here.</p>
-->
<p>Die Variablenbelegungen bestehen aus einer Abbildung von
Variablennamen auf Variablenwerte. Der Wert einer Variablen ist ein
Objekt, welches von jedem beliebigen Typ sein kann, der für Ausdrücke
möglich ist. Daneben sind auch weitere Typen möglich, die hier
nicht spezifiziert werden.</p>

<transnote>
<p>
In der XSLT-1.0-Spezifikation <bibref ref="XSLT" /> wird beispielsweise
als neuer Typ <emph>Ergebnisteilbaum</emph> (<emph>result tree 
fragment</emph>) eingeführt. Werte
dieses Typs entstehen im Ergebnis des Transformationsprozesses. Durch
die folgende Variablenvereinbarung wird z.B. eine Variable namens
<code>antwort</code> erzeugt, deren Wert ein 
<emph>Ergebnisteilbaum</emph> ist:
</p>
<eg><![CDATA[
<xsl:variable name="antwort">
   <antwort><xsl:value-of select="6 * 7" /></antwort>
</xsl:variable>]]></eg>
<p>
Dieser Typ wird voraussichtlich in zukünftigen XSLT-Versionen nicht
mehr existieren, da das Ergebnis einer Transformation dann eine normale
Knotenmenge vom Typ <emph>node-set</emph> sein wird, siehe 
<bibref ref="XSLT20" />.
</p><p>
Die folgende Anweisung erzeugt dagegen eine Variable, deren Wert sich
aus der Berechnung eines XPath-Ausdrucks <emph>expression</emph> ergibt:
</p>
<eg><![CDATA[
<xsl:variable name="var" select="]]><emph>expression</emph>" /&gt;
</eg>
<p>
An dieser Stelle sei darauf hingewiesen, dass die Erzeugung der 
Variablenbelegungen für <code>antwort</code> und <code>var</code> ein 
XSLT-Sprachmittel ist. XPath selbst stellt hierfür keinerlei Konstrukte
bereit. Neben <code>xsl:variable</code> besitzt XSLT für diesen Zweck
<code>xsl:param</code>.
</p><p>
Die XPointer-Spezifikation <bibref ref="XPTR" />, die ebenfalls XPath
nutzt, sieht keine Möglichkeiten für das Erzeugen von 
Variablenbelegungen vor. Die Verwendung von Variablenreferenzen 
innerhalb eines XPointer-Ausdrucks führt daher zu einem syntaktischen 
Fehler. Die als Arbeitsentwurf des W3C vorgelegte Abfragesprache für 
XML-Dokumente XQuery <bibref ref="XQUERY" /> benutzt zur Erzeugung von 
Variablenbelegungen so genannte FLWR-Ausdrücke (gesprochen 
<quote>flower</quote>, eine Abkürzung für <code>FOR</code>-, 
<code>LET</code>-, <code>WHERE</code>- und 
<code>RETURN</code>-Klauseln).
</p><p>
Andere auf XPath aufbauende Spezifikationen müssen in analoger Weise 
definieren, wie Variablenbelegungen für einen Kontext erzeugt werden.
</p>
</transnote>

<!-- ORIG
<p>The function library consists of a mapping from function names to
functions.  Each function takes zero or more arguments and returns a
single result.  This document defines a core function library that all
XPath implementations must support (see <specref ref="corelib"/>).
For a function in the core function library, arguments and result are
of the four basic types.  Both XSLT and XPointer extend XPath by
defining additional functions; some of these functions operate on the
four basic types; others operate on additional data types defined by
XSLT and XPointer.</p>
-->
<p>Die Funktionsbibliothek besteht aus einer Abbildung von 
Funktionsnamen auf Funktionen. Jede Funktion besitzt null oder mehr
Argumente und liefert einen einzelnen Wert. Diese Spezifikation
definiert eine Bibliothek von Grundfunktionen, die von allen 
XPath-Implementationen unterstützt werden muss (siehe <specref 
ref="corelib"/>). Bei einer Grundfunktion gehören die Argumente und
das Ergebnis einem der vier Grundtypen an. Sowohl XSLT als auch
XPointer erweitern XPath um zusätzliche Funktionen, von denen
einige auf den vier Grundtypen, andere auf zusätzlichen, durch XSLT und
XPointer definierten Typen operieren.</p>

<!-- ORIG
<p>The namespace declarations consist of a mapping from prefixes to
namespace URIs.</p>
-->
<p>Namensraumdeklarationen bestehen aus einer Abbildung von
Präfixen auf Namensraum-URIs.</p>

<transnote>
<p>
Angenommen, ein Element enthält in seinem Start-Tag folgende 
Namensraumdeklaration:
<code>xmlns:xlink="http://www.w3.org/1999/xlink"</code>.
Ein Kontext, für den diese Deklaration gültig ist, enthält dann
eine Abbildung des Präfixes <code>xlink</code> auf den URI 
<code>http://www.w3.org/1999/xlink</code>.
</p>
</transnote>

<!-- ORIG
<p>The variable bindings, function library and namespace declarations
used to evaluate a subexpression are always the same as those used to
evaluate the containing expression.  The context node, context
position, and context size used to evaluate a subexpression are
sometimes different from those used to evaluate the containing
expression. Several kinds of expressions change the context node; only
predicates change the context position and context size (see <specref
ref="predicates"/>).  When the evaluation of a kind of expression is
described, it will always be explicitly stated if the context node,
context position, and context size change for the evaluation of
subexpressions; if nothing is said about the context node, context
position, and context size, they remain unchanged for the
evaluation of subexpressions of that kind of expression.</p>
-->
<p>Die Variablenbelegungen, die Funktionsbibliothek und die
Namensraumdeklarationen, die benutzt werden, um einen Teilausdruck
zu berechnen, sind immer dieselben, die auch für den umgebenden
Ausdruck benutzt werden. Der Kontextknoten, die Kontextposition und
die Kontextgröße, die zur Berechnung eines Teilausdrucks benutzt
werden, sind dagegen zuweilen verschieden von denen des umgebenden
Ausdrucks. Mehrere Arten von Ausdrücken ändern den Kontextknoten,
aber nur Prädikate ändern die Kontextposition und die Kontextgröße 
(siehe <specref ref="predicates"/>).  
Bei der Beschreibung, wie bestimmte Ausdrücke zu berechnen sind, wird
immer explizit angegeben, ob sich der Kontextknoten, die
Kontextposition oder die Kontextgröße bei der Berechnung von
Teilausdrücken ändert. Wird nichts über Kontextknoten,
Kontextposition und Kontextgröße ausgesagt, bleiben sie bei der
Berechnung von Teilausdrücken dieser Ausdrücke gleich.</p>

<transnote>
<p>
Zur Erklärung hier ein kleiner Vorgriff:
</p><p>
Innerhalb eines Lokalisierungspfades ändert jeder Schritt den
Kontextknoten, der für die Berechnung der folgenden Schritte relevant 
ist. Durch ein Prädikat werden Knoten aus einer Knotenmenge 
herausgefiltert, sodass die Kontextgröße sich in der Regel verkleinert 
und die Position der gefilterten Knoten sich entsprechend ändert.
</p>
</transnote>

<!-- Fehler: "entity reference" anstelle von "character reference" -->
<!-- ORIG
<p>XPath expressions often occur in XML attributes.  The grammar
specified in this section applies to the attribute value after XML 1.0
normalization.  So, for example, if the grammar uses the character
<code>&lt;</code>, this must not appear in the XML source as
<code>&lt;</code> but must be quoted according to XML 1.0 rules by,
for example, entering it as <code>&amp;lt;</code>. Within expressions,
literal strings are delimited by single or double quotation marks,
which are also used to delimit XML attributes. To avoid a quotation
mark in an expression being interpreted by the XML processor as
terminating the attribute value the quotation mark can be entered as a
character reference (<code>&amp;quot;</code> or
<code>&amp;apos;</code>).  Alternatively, the expression can use single
quotation marks if the XML attribute is delimited with double
quotation marks or vice-versa.</p>
-->
<p>XPath-Ausdrücke erscheinen häufig in XML-Attributen. Die in diesem
Abschnitt spezifizierte Grammatik wird auf Attributwerte nach ihrer
Normalisierung gemäß XML 1.0 angewendet. Wenn beispielsweise die
Grammatik das Zeichen <code>&lt;</code> verwendet, darf dieses
nicht in der XML-Quelle als <code>&lt;</code> auftreten, sondern muss
gemäß den XML-1.0-Regeln notiert werden, zum Beispiel durch Eingabe
als <code>&amp;lt;</code>. Innerhalb von Ausdrücken werden
Zeichenkettenliterale durch einfache oder doppelte Anführungszeichen
begrenzt, die ebenfalls zur Begrenzung von XML-Attributen verwendet
werden. Um zu vermeiden, dass ein Anführungszeichen innerhalb eines
Ausdrucks durch den XML-Prozessor als Abschluss des Attributwertes
interpretiert wird, kann das Anführungszeichen als Zeichenreferenz
eingegeben werden (<code>&amp;quot;</code> oder
<code>&amp;apos;</code>). Alternativ können im Ausdruck einfache
Anführungszeichen benutzt werden, falls das XML-Attribut durch
doppelte Anführungszeichen begrenzt wird oder umgekehrt.</p>

<transnote>
<p>
Statt <quote>Zeichenreferenz</quote> muss es hier 
<quote>Entity-Referenz</quote> heißen.
</p><p>
Abgesehen davon gibt es immer noch Fälle, in denen dieses einfache
Kochrezept nicht ausreichend ist &ndash; nämlich dann, wenn eine 
Zeichenkette benötigt wird, die beide Arten von Anführungszeichen 
enthalten soll.
</p><p>
Angenommen, es soll getestet werden, ob der Inhalt des Elements 
<code>para</code> mit der Zeichenkette »Sie fragte: "Wie geht's?"« 
übereinstimmt. Möchte man diese Zeichenkette innerhalb eines 
XPath-Ausdrucks durch doppelte Anführungszeichen begrenzen, könnte man 
auf die Idee kommen, beispielsweise durch Verwendung der 
Entity-Referenz <code>&amp;quot;</code> Folgendes zu schreiben:
</p>
<eg>para="Sie fragte: &amp;quot;Wie geht's?&amp;quot;"</eg>
<p>
Das ist aber keine Lösung, da ein XML-Parser, der diese Zeichenfolge
analysiert, Entity-Referenzen auflöst. Ein darauf aufsetzender 
XPath-Prozessor kann nicht mehr zwischen »"« und 
»<code>&amp;quot;</code>« unterscheiden. Formuliert man im nächsten
Schritt dann nämlich weiter
</p>
<eg><![CDATA[<xsl:if test='para="Sie fragte: &quot;Wie geht&apos;s?&quot;"'>]]></eg>
<p>
(diese Zeile ist im XML-Sinn wohlgeformt), so führt das zu einem
Fehler im XPath-Prozessor, da dieser trotzdem die folgende Zeichenkette
auswertet:
</p>
<eg>para="Sie fragte: "Wie geht's?""</eg>
<p>
Eine einfache Lösung für solche Fälle besteht darin, die betreffende 
Zeichenkette als Wert einer Variablen zu definieren, etwa in XSLT per 
</p>
<eg><![CDATA[<xsl:variable name="string">Sie fragte: "Wie geht's?"</xsl:variable>]]></eg>
<p>
und anschließend diese Variable in XPath-Ausdrücken zu verwenden. 
</p>
<eg><![CDATA[<xsl:if test="para=$string">]]></eg>
<p>
Alternativ kann man die gewünschte Zeichenkette aus mehreren Teilen
zusammensetzen (unter Benutzung der noch zu erläuternden Funktion
<function>concat</function>), wobei jede Teilzeichenkette jeweils nur 
eine Sorte von Anführungszeichen enthält:
</p>
<eg>
para=concat('Sie fragte: &quot;Wie geht', &quot;'&quot;, 's?&quot;')
</eg>
<p>
Das Anführungszeichen, das zur Begrenzung dieses Ausdrucks innerhalb 
eines Attributwertes genutzt wird, muss dann durch die dazugehörige 
Entity-Referenz ersetzt werden. Das Ergebnis sieht zwar unübersichtlich
aus, ist aber syntaktisch korrekt:
</p>
<eg><![CDATA[
<xsl:if test="para=concat('Sie fragte: &quot;Wie geht',
                          &quot;'&quot;, 's?&quot;')">
]]></eg>
<p>
Diese zweite Variante muss verwendet werden, wenn Variablen nicht 
erlaubt sind, etwa innerhalb eines XSLT-Musters oder als Bestandteil 
eines XPointers.
</p>
</transnote>

<!-- ORIG
<p>One important kind of expression is a location path.  A location
path selects a set of nodes relative to the context node.  The result
of evaluating an expression that is a location path is the node-set
containing the nodes selected by the location path.  Location paths
can recursively contain expressions that are used to filter sets of
nodes.  A location path matches the production <nt
def="NT-LocationPath">LocationPath</nt>.</p>
-->
<p>Ein wichtiger spezieller Ausdruck ist der Lokalisierungspfad. Ein
Lokalisierungspfad wählt eine Knotenmenge relativ zu einem 
Kontextknoten aus. Das Ergebnis der Berechnung eines Ausdrucks, der
ein Lokalisierungspfad ist, ist genau die Knotenmenge, die die durch 
den Lokalisierungspfad ausgewählten Knoten enthält.
Lokalisierungspfade können Ausdrücke rekursiv enthalten, die zum
Filtern von Knotenmengen benutzt werden. Ein Lokalisierungspfad
lässt sich aus der Produktion <nt 
def="NT-LocationPath">LocationPath</nt> ableiten.</p>

<!-- ORIG
<p>In the following grammar, the non-terminals <xnt
href="&XMLNames;#NT-QName">QName</xnt> and <xnt
href="&XMLNames;#NT-NCName">NCName</xnt> are defined in <bibref
ref="XMLNAMES"/>, and <xnt href="&XML;#NT-S">S</xnt> is defined in
<bibref ref="XML"/>.  The grammar uses the same EBNF notation as
<bibref ref="XML"/> (except that grammar symbols always have initial
capital letters).</p>
-->
<p>Die in der nachfolgenden Grammatik verwendeten Nichtterminale <xnt
href="&XMLNames;#NT-QName">QName</xnt> und <xnt
href="&XMLNames;#NT-NCName">NCName</xnt> sind in <bibref
ref="XMLNAMES"/> definiert, <xnt href="&XML;#NT-S">S</xnt> ist in
<bibref ref="XML"/> definiert. Die Grammatik verwendet die gleiche
EBNF-Notation wie in <bibref ref="XML"/> (mit der Ausnahme, dass 
Grammatiksymbole immer mit einem Großbuchstaben beginnen).</p>

<transnote>
<p>
Die <emph>Erweiterte Backus-Naur-Form (EBNF)</emph> wird zur Notation
von formalen Grammatiken verwendet. Sie wird im Kapitel 
<xnt href="&XML;#6">Notation</xnt> der XML-Spezifikation
<bibref ref="XML-2" /> näher erläutert.
</p>
</transnote>

<!-- ORIG
<p>Expressions are parsed by first dividing the character string to be
parsed into tokens and then parsing the resulting sequence of tokens.
Whitespace can be freely used between tokens.  The tokenization
process is described in <specref ref="exprlex"/>.</p>
-->
<p>Ausdrücke werden geparst, indem die Zeichenfolge in einzelne
Tokens zerlegt und anschließend die entstehende Folge der Tokens 
geparst wird. Leerraumzeichen können beliebig zwischen Tokens verwendet
werden. Der Zerlegungsprozess wird in <specref ref="exprlex"/>
beschrieben.</p>

<transnote>
<p>
Ein Token ist eine syntaktische Einheit von Zeichen, etwa der Name
»<code>html</code>«, die Zahl »<code>3.14159</code>« oder der Operator
»<code>!=</code>«. Die zwischen diesen Tokens erlaubten Leerraumzeichen 
sind gemäß der XML-Spezifikation Folgen aus Leerzeichen (#x20), 
Tabulatoren (#x9), Zeilenvorschüben (#xA) und Wagenrückläufen (#xD). 
Innerhalb eines Tokens dürfen keine solchen Leerraumzeichen auftreten, 
so z.B. nicht zwischen den beiden einzelnen Zeichen 
»<code>!</code>« und »<code>=</code>« des Operators »<code>!=</code>«.
</p>
</transnote>

</div1>

<div1 id="location-paths">
<!-- ORIG
<head>Location Paths</head>
-->
<head>Lokalisierungspfade</head>

<!-- ORIG
<p>Although location paths are not the most general grammatical
construct in the language (a <nt
def="NT-LocationPath">LocationPath</nt> is a special case of an <nt
def="NT-Expr">Expr</nt>), they are the most important construct and
will therefore be described first.</p>
-->
<p>Obwohl Lokalisierungspfade nicht das allgemeinste grammatische
Konstrukt der Sprache darstellen (ein <nt 
def="NT-LocationPath">Lokalisierungspfad</nt> ist ein Spezialfall eines
<nt def="NT-Expr">Ausdrucks</nt>), sind sie doch das wichtigste
Konstrukt und werden deshalb als Erstes beschrieben.</p>

<!-- ORIG
<p>Every location path can be expressed using a straightforward but
rather verbose syntax.  There are also a number of syntactic
abbreviations that allow common cases to be expressed concisely.  This
section will explain the semantics of location paths using the
unabbreviated syntax.  The abbreviated syntax will then be explained
by showing how it expands into the unabbreviated syntax (see <specref
ref="path-abbrev"/>).</p>
-->
<p>Jeder Lokalisierungspfad kann durch eine unkomplizierte und 
eher verbale Syntax ausgedrückt werden. Daneben gibt es eine Reihe
von syntaktischen Abkürzungen, mit denen sich häufige Fälle kurz und 
prägnant ausdrücken lassen. Dieser Abschnitt erläutert die Semantik von 
Lokalisierungspfaden anhand der ausführlichen Syntax. Die 
abgekürzte Syntax wird im Anschluss daran erläutert, indem gezeigt
wird, wie diese auf die ausführliche Syntax abgebildet wird (siehe 
<specref ref="path-abbrev"/>).</p>

<!-- ORIG
<p>Here are some examples of location paths using the unabbreviated
syntax:</p>
-->
<p>Es folgen einige Beispiele für Lokalisierungspfade unter
Benutzung der ausführlichen Syntax:</p>

<ulist>

<!-- ORIG
<item><p><code>child::para</code> selects the
<code>para</code> element children of the context node</p></item>
-->
<item><p><code>child::para</code> wählt die Kindelemente
<code>para</code> des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>child::*</code> selects all element
children of the context node</p></item>
-->
<item><p><code>child::*</code> wählt alle Kindelemente des 
Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>child::text()</code> selects all text
node children of the context node</p></item>
-->
<item><p><code>child::text()</code> wählt alle Textknoten aus, die
Kinder des Kontextknotens sind.</p></item>

<!-- ORIG
<item><p><code>child::node()</code> selects all the
children of the context node, whatever their node type</p></item>
-->
<item><p><code>child::node()</code> wählt alle Kindknoten des
Kontextknotens aus, unabhängig von ihrem Knotentyp.</p>
<transnote>
<p>
Obwohl sich sämtliche XPath-Lokalisierungspfade für Kontextknoten
jedes Typs anwenden lassen, muss an dieser Stelle darauf hingewiesen
werden, dass nur der Wurzelknoten sowie Elementknoten Kinder haben 
können. Diese Kinder können Element-, Text-, Kommentar- und 
Processing-Instruction-Knoten sein. Attribut- und Namensraumknoten 
sind niemals Kinder anderer Knoten. Dieses Konzept wird noch einmal 
ausführlich in Kapitel <specref ref="data-model" /> beschrieben.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>attribute::name</code> selects the
<code>name</code> attribute of the context node</p></item>
-->
<item><p><code>attribute::name</code> wählt das Attribut
<code>name</code> des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>attribute::*</code> selects all the
attributes of the context node</p></item>
-->
<item><p><code>attribute::*</code> wählt alle Attribute des
Kontextknotens aus.</p>
<transnote>
<p>
Diese beiden Ausdrücke sind nur sinnvoll, wenn der Kontextknoten ein 
Elementknoten ist. Für alle anderen Knotentypen liefern sie die leere 
Knotenmenge.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>descendant::para</code> selects the
<code>para</code> element descendants of the context node</p></item>
-->
<item><p><code>descendant::para</code> wählt die
<code>para</code>-Elemente aus, die Nachkommen des Kontextknotens
sind.</p></item>

<!-- ORIG
<item><p><code>ancestor::div</code> selects all <code>div</code>
ancestors of the context node</p></item>
-->
<item><p><code>ancestor::div</code> wählt alle 
<code>div</code>-Elemente aus, die Vorfahren des Kontextknotens 
sind.</p></item>

<!-- ORIG
<item><p><code>ancestor-or-self::div</code> selects the
<code>div</code> ancestors of the context node and, if the context node is a
<code>div</code> element, the context node as well</p></item>
-->
<item><p><code>ancestor-or-self::div</code> wählt alle
<code>div</code>-Vorfahren des Kontextknotens sowie auch den 
Kontextknoten selbst aus, falls dieser ein <code>div</code>-Element 
ist.</p></item>

<!-- ORIG
<item><p><code>descendant-or-self::para</code> selects the
<code>para</code> element descendants of the context node and, if the context node is
a <code>para</code> element, the context node as well</p></item>
-->
<item><p><code>descendant-or-self::para</code> wählt alle
<code>para</code>-Nachkommen des Kontextknotens aus, sowie auch den
Kontextknoten selbst, falls dieser ein <code>para</code>-Element 
ist.</p></item>

<!-- ORIG
<item><p><code>self::para</code> selects the context node if it is a
<code>para</code> element, and otherwise selects nothing</p></item>
-->
<item><p><code>self::para</code> wählt den Kontextknoten aus, falls 
dieser ein <code>para</code>-Element ist, und sonst 
nichts.</p></item>

<!-- ORIG
<item><p><code>child::chapter/descendant::para</code>
selects the <code>para</code> element descendants of the
<code>chapter</code> element children of the context node</p></item>
-->
<item><p><code>child::chapter/descendant::para</code>
wählt die <code>para</code>-Elemente aus, die Nachkommen der
<code>chapter</code>-Kindelemente des Kontextknotens sind.</p></item>

<!-- ORIG
<item><p><code>child::*/child::para</code> selects
all <code>para</code> grandchildren of the context node</p></item>
-->
<item><p><code>child::*/child::para</code> wählt 
alle <code>para</code>-Enkelelemente des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>/</code> selects the document root (which is
always the parent of the document element)</p></item>
-->
<item><p><code>/</code> wählt die Wurzel des Dokuments aus (diese
ist immer der Vater des Dokumentelements).</p>
<transnote>
<p>
Der Begriff <emph>Wurzel</emph> unterscheidet sich hier von dem
in der XML-Spezifikation <bibref ref="XML-2" /> genutzten. Dort 
bezeichnen Wurzel und Dokumentelement das Gleiche. In der 
XPath-Terminologie ist das Dokumentelement ein Kind des Wurzelknotens. 
Der Wurzelknoten entspricht damit dem <emph>Dokument-Entity</emph>,
siehe <specref ref="root-node" />. Das ist insofern wichtig, als
der Wurzelknoten zusätzlich Kommentar- oder 
Processing-Instruction-Knoten als Kinder haben kann, die damit
Geschwister des Dokumentelements sind.
</p><p>
Des Weiteren muss hier hinzugefügt werden, dass durch <code>/</code>
die Wurzel des Dokuments ausgewählt wird, in dem sich der Kontextknoten
befindet. Es lässt sich leicht eine Knotenmenge bilden, die Knoten
aus verschiedenen Dokumenten enthält. Die in XSLT definierte
Funktion <xfunction href="&XSLTSPEC;">document</xfunction>
<!-- ohne xfunction-Element:
<loc href="&XSLTSPEC;#function-document">document</loc>
-->
liefert beispielsweise den Wurzelknoten eines anderen Dokuments.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>/descendant::para</code> selects all the
<code>para</code> elements in the same document as the context node</p></item>
-->
<item><p><code>/descendant::para</code> wählt alle
<code>para</code>-Elemente aus, die im gleichen Dokument wie der
Kontextknoten enthalten sind.</p>
<transnote>
<p>
Genau genommen werden alle <code>para</code>-Elemente ausgewählt, die 
Nachkommen der Wurzel des Dokuments sind, zu dem der Kontextknoten 
gehört.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>/descendant::olist/child::item</code> selects all the
<code>item</code> elements that have an <code>olist</code> parent and
that are in the same document as the context node</p></item>
-->
<item><p><code>/descendant::olist/child::item</code> wählt alle
<code>item</code>-Elemente aus, die ein <code>olist</code>-Vaterelement
besitzen und die sich im gleichen Dokument wie der Kontextknoten
befinden.</p>
<transnote>
<p>
Die folgenden Beispiele zeigen Lokalisierungspfade, bei denen die
ursprünglich ausgewählten Knotenmengen durch nachgestellte 
Filterausdrücke in eckigen Klammern, so genannte Prädikate,
weiter eingeschränkt werden.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>child::para[position()=1]</code> selects the first
<code>para</code> child of the context node</p></item>
-->
<item><p><code>child::para[position()=1]</code> wählt das erste
<code>para</code>-Kindelement des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>child::para[position()=last()]</code> selects the last
<code>para</code> child of the context node</p></item>
-->
<item><p><code>child::para[position()=last()]</code> wählt das letzte
<code>para</code>-Kindelement des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>child::para[position()=last()-1]</code> selects
the last but one <code>para</code> child of the context node</p></item>
-->
<item><p><code>child::para[position()=last()-1]</code> wählt das
vorletzte <code>para</code>-Kindelement des Kontextknotens 
aus.</p></item>

<!-- ORIG
<item><p><code>child::para[position()>1]</code> selects all
the <code>para</code> children of the context node other than the
first <code>para</code> child of the context node</p></item>
-->
<item><p><code>child::para[position()>1]</code> wählt alle 
<code>para</code>-Kindelemente des Kontextknotens aus, mit Ausnahme des
ersten <code>para</code>-Kindelements des Kontextknotens.</p></item>

<!-- ORIG
<item><p><code>following-sibling::chapter[position()=1]</code>
selects the next <code>chapter</code> sibling of the context node</p></item>
-->
<item><p><code>following-sibling::chapter[position()=1]</code>
wählt das nächste <code>chapter</code>-Geschwisterelement des
Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>preceding-sibling::chapter[position()=1]</code>
selects the previous <code>chapter</code> sibling of the context
node</p></item>
-->
<item><p><code>preceding-sibling::chapter[position()=1]</code>
wählt das vorhergehende <code>chapter</code>-Geschwisterelement des
Kontextknotens aus.</p>
<transnote>
<p>
An dieser Stelle sei als kurzer Vorgriff darauf hingewiesen, dass sich 
die Position eines Knotens in der aktuellen Kontextknotenliste über die
Funktion <function>position</function> bestimmen lässt und diese 
Position offenbar von der Blickrichtung abhängt. Von allen 
vorhergehenden Geschwisterelementen befindet sich der unmittelbare 
Vorgänger an der Position 1.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>/descendant::figure[position()=42]</code> selects
the forty-second <code>figure</code> element in the
document</p></item>
-->
<item><p><code>/descendant::figure[position()=42]</code> wählt das
zweiundvierzigste <code>figure</code>-Element im Dokument aus.</p>
<transnote>
<p>
Hier werden alle <code>figure</code>-Nachkommen des Wurzelknotens 
betrachtet. Ausgehend von ihrer natürlichen Reihenfolge im Dokument 
wird aus der gesamten Menge das zweiundvierzigste ausgewählt. 
Die Definition dieser natürlichen Reihenfolge, der so genannten <termref 
def="dt-document-order">Dokumentordnung</termref>, ist Bestandteil des 
Kapitels <specref ref="data-model" />.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>/child::doc/child::chapter[position()=5]/child::section[position()=2]</code>
selects the second <code>section</code> of the fifth
<code>chapter</code> of the <code>doc</code> document
element</p></item>
-->
<item><p><code>/child::doc/child::chapter[position()=5]/child::section[position()=2]</code>
wählt das zweite <code>section</code>-Element des fünften
<code>chapter</code>-Elements des <code>doc</code>-Dokumentelements
aus.</p></item>

<!-- ORIG
<item><p><code>child::para[attribute::type="warning"]</code>
selects all <code>para</code> children of the context node that have a
<code>type</code> attribute with value <code>warning</code></p></item>
-->
<item><p><code>child::para[attribute::type="warning"]</code>
wählt alle <code>para</code>-Kindelemente des Kontextknotens aus, die
ein <code>type</code>-Attribut mit dem Wert <code>warning</code>
besitzen.</p></item>

<!-- ORIG
<item><p><code>child::para[attribute::type='warning'][position()=5]</code>
selects the fifth <code>para</code> child of the context node that has
a <code>type</code> attribute with value
<code>warning</code></p></item>
-->
<item><p><code>child::para[attribute::type='warning'][position()=5]</code>
wählt das fünfte <code>para</code>-Kindelement des Kontextknotens aus,
das ein Attribut <code>type</code> mit dem Wert <code>warning</code>
besitzt.</p></item>

<!-- ORIG
<item><p><code>child::para[position()=5][attribute::type="warning"]</code>
selects the fifth <code>para</code> child of the context node if that
child has a <code>type</code> attribute with value
<code>warning</code></p></item>
-->
<item><p><code>child::para[position()=5][attribute::type="warning"]</code>
wählt das fünfte <code>para</code>-Kindelement des Kontextknotens aus,
wenn dieses Kind ein <code>type</code>-Attribut mit dem Wert
<code>warning</code> besitzt.</p>
<transnote>
<p>
Die letzten beiden Beispiele zeigen, wie sich durch ein Prädikat 
Kontextgröße und -position ändern können. Das Prädikat 
<code>[position()=5]</code> liefert immer eine Knotenmenge, die maximal
einen Knoten enthält, je nachdem, ob es einen fünften Knoten gibt oder
nicht. Das erste der beiden Beispiele beschränkt zunächst die 
betrachtete Knotenmenge auf die <code>para</code>-Elemente mit dem
Attribut <code>type="warning"</code> und wählt anschließend aus diesen 
das fünfte aus. Das zweite Beispiel wählt zuerst das fünfte 
<code>para</code>-Element und anschließend aus der 
verbleibenden Knotenmenge die Knoten mit dem gewünschten Attribut aus. 
Besitzt das fünfte <code>para</code>-Element also gerade kein Attribut
<code>type="warning"</code>, so ist das Ergebnis in diesem Fall die 
leere Knotenmenge.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>child::chapter[child::title='Introduction']</code>
selects the <code>chapter</code> children of the context node that
have one or more <code>title</code> children with <termref
def="dt-string-value">string-value</termref> equal to
<code>Introduction</code></p></item>
-->
<item><p><code>child::chapter[child::title='Introduction']</code>
wählt die <code>chapter</code>-Kindelemente des Kontextknotens aus,
die wenigstens ein <code>title</code>-Kindelement mit einem <termref
def="dt-string-value">Zeichenkettenwert</termref> gleich
<code>Introduction</code> besitzen.</p></item>

<!-- ORIG
<item><p><code>child::chapter[child::title]</code> selects the
<code>chapter</code> children of the context node that have one or
more <code>title</code> children</p></item>
-->
<item><p><code>child::chapter[child::title]</code> wählt die
<code>chapter</code>-Kindelemente des Kontextknotens aus, die ein
oder mehrere <code>title</code>-Kindelemente besitzen.</p></item>

<!-- ORIG
<item><p><code>child::*[self::chapter or self::appendix]</code>
selects the <code>chapter</code> and <code>appendix</code> children of
the context node</p></item>
-->
<item><p><code>child::*[self::chapter or self::appendix]</code>
wählt die <code>chapter</code>- und <code>appendix</code>-Kindelemente 
des Kontextknotens aus.</p>
<transnote>
<p>
Hier werden aus allen Kindern (<code>child::*</code>) diejenigen 
ausgewählt, die selbst (<code>self::</code>) entweder ein 
<code>chapter</code>- oder ein <code>appendix</code>-Element sind. 
Hier muss man etwas aufpassen, da der Ausdruck in den eckigen
Klammern für einen anderen Kontextknoten ausgewertet wird als der
Ausdruck vor den Klammern. Der Vergleich mit den beiden vorhergehenden 
Beispielen verdeutlicht den Unterschied. Die genaue Definition
folgt in Kapitel <specref ref="predicates" />.
</p>
</transnote>
</item>

<!-- ORIG
<item><p><code>child::*[self::chapter or
self::appendix][position()=last()]</code> selects the last
<code>chapter</code> or <code>appendix</code> child of the context
node</p></item>
-->
<item><p><code>child::*[self::chapter or
self::appendix][position()=last()]</code> wählt das letzte
<code>chapter</code>- oder <code>appendix</code>-Kindelement des
Kontextknotens aus.</p>
<transnote>
<p>
Hier wird zunächst die Menge aller <code>chapter</code>- oder 
<code>appendix</code>-Kinder betrachtet und aus dieser dann das letzte 
ausgewählt. Die Ergebnisknotenmenge enthält damit (maximal) einen 
Knoten.
</p>
</transnote>
</item>

</ulist>

<!-- ORIG
<p>There are two kinds of location path: relative location paths
and absolute location paths.</p>
-->
<p>Es gibt zwei Arten von Lokalisierungspfaden: relative und absolute
Lokalisierungspfade.</p>

<!-- ORIG
<p>A relative location path consists of a sequence of one or more
location steps separated by <code>/</code>.  The steps in a relative
location path are composed together from left to right.  Each step in
turn selects a set of nodes relative to a context node. An initial
sequence of steps is composed together with a following step as
follows.  The initial sequence of steps selects a set of nodes
relative to a context node.  Each node in that set is used as a
context node for the following step.  The sets of nodes identified by
that step are unioned together.  The set of nodes identified by
the composition of the steps is this union. For example,
<code>child::div/child::para</code> selects the
<code>para</code> element children of the <code>div</code> element
children of the context node, or, in other words, the
<code>para</code> element grandchildren that have <code>div</code>
parents.</p>
-->
<p>Ein relativer Lokalisierungspfad wird durch eine Folge aus einem
oder mehreren Lokalisierungsschritten gebildet, die durch <code>/</code>
voneinander getrennt sind. Die Schritte eines relativen
Lokalisierungspfades werden von links nach rechts zusammengesetzt.
Jeder Schritt wählt der Reihe nach eine Knotenmenge relativ zu einem 
Kontextknoten aus. Eine Anfangsfolge von Schritten wird mit einem 
folgenden Schritt wie folgt zusammengesetzt: Die Anfangsfolge von 
Schritten wählt eine Knotenmenge relativ zu einem Kontextknoten aus. 
Jeder Knoten in dieser Menge wird dann als Kontextknoten für den 
folgenden Schritt benutzt. Die durch diesen Schritt bestimmten 
Knotenmengen werden vereinigt. Die Vereinigung ist dann genau die 
Knotenmenge, die durch das Zusammensetzen der Schritte ausgewählt wird.
Zum Beispiel wählt <code>child::div/child::para</code> die
<code>para</code>-Kindelemente der <code>div</code>-Kindelemente des
Kontextknotens aus, oder &ndash; mit anderen Worten &ndash; die
<code>para</code>-Enkelelemente, die <code>div</code>-Elternelemente
haben.</p>

<!-- ORIG
<p>An absolute location path consists of <code>/</code> optionally
followed by a relative location path.  A <code>/</code> by itself
selects the root node of the document containing the context node.  If
it is followed by a relative location path, then the location path
selects the set of nodes that would be selected by the relative
location path relative to the root node of the document containing the
context node.</p>
-->
<p>Ein absoluter Lokalisierungspfad besteht aus dem Zeichen
<code>/</code> und einem optional folgenden relativen 
Lokalisierungspfad. Ein <code>/</code> allein wählt den
Wurzelknoten des Dokuments aus, das den Kontextknoten enthält.
Falls ein relativer Lokalisierungspfad folgt, so wählt der
Lokalisierungspfad die Knotenmenge aus, die ein relativer
Lokalisierungspfad relativ zum Wurzelknoten des den Kontextknoten
enthaltenen Dokuments auswählen würde.</p>
<transnote>
<p>
Hier bietet sich der Vergleich zu Pfaden im Dateisystem an: Sowohl in 
UNIX-Betriebssystemen als auch innerhalb von URLs wird der Schrägstrich
»<code>/</code>« als Trennzeichen innerhalb von Dateipfaden benutzt. 
In ähnlicher Weise kann man sich Pfade in einem XML-Baum vorstellen. 
Ein relativer Pfad geht immer vom aktuellen Knoten (dem Kontextknoten) 
aus, ein absoluter Pfad beginnt immer an der Dokumentwurzel.
Genau genommen ist ein absoluter Pfad allerdings ebenfalls relativ,
nämlich zum Dokument des Kontextknotens. Das spielt eine Rolle, wenn 
Knoten aus mehreren Dokumenten verarbeitet werden.
</p><p>
Man sollte sich allerdings einer Feinheit bewusst sein: Während 
beispielsweise durch »<code>verzeichnis1/verzeichnis2/datei3</code>«
in einem Dateisystem exakt eine Datei adressiert wird, eben jene, die 
den Namen »<code>datei3</code>« trägt und sich in dem Unterverzeichnis 
»<code>verzeichnis1/verzeichnis2</code>« befindet, wählt ein analoger 
XPath immer eine Knotenmenge aus, die in der Regel mehrere Knoten 
enthalten kann. Das sollte aber nicht weiter verwundern, darf ein 
Element doch durchaus mehrere gleichnamige Kindelemente besitzen.
</p>
</transnote>

<scrap>
<!-- ORIG
<head>Location Paths</head>
-->
<head>Lokalisierungspfade</head>
<prodgroup pcw5="1" pcw2="10" pcw4="18">
<prod id="NT-LocationPath">
<lhs>LocationPath</lhs>
<rhs><nt def="NT-RelativeLocationPath">RelativeLocationPath</nt></rhs>
<rhs>| <nt def="NT-AbsoluteLocationPath">AbsoluteLocationPath</nt></rhs>
</prod>
<prod id="NT-AbsoluteLocationPath">
<lhs>AbsoluteLocationPath</lhs>
<rhs>'/' <nt def="NT-RelativeLocationPath">RelativeLocationPath</nt>?</rhs>
<rhs>| <nt def="NT-AbbreviatedAbsoluteLocationPath">AbbreviatedAbsoluteLocationPath</nt></rhs>
</prod>
<prod id="NT-RelativeLocationPath">
<lhs>RelativeLocationPath</lhs>
<rhs><nt def="NT-Step">Step</nt></rhs>
<rhs>| <nt def="NT-RelativeLocationPath">RelativeLocationPath</nt> '/' <nt def="NT-Step">Step</nt></rhs>
<rhs>| <nt def="NT-AbbreviatedRelativeLocationPath">AbbreviatedRelativeLocationPath</nt></rhs>
</prod>
</prodgroup>
</scrap>
<transnote>
<p>
Die obige Grammatik gibt das bisher Beschriebene noch einmal formal 
wieder. Wie man sieht, können Lokalisierungspfade auch abgekürzte 
Bestandteile enthalten. Diese werden in Kapitel 
<specref ref="path-abbrev" /> beschrieben.
</p>
</transnote>

<div2>
<!-- ORIG
<head>Location Steps</head>
-->
<head>Lokalisierungsschritte</head>

<!-- ORIG
<p>A location step has three parts:</p>
-->
<p>Ein Lokalisierungsschritt hat drei Bestandteile:</p>

<ulist>

<!-- ORIG
<item><p>an axis, which specifies the tree relationship between the
nodes selected by the location step and the context node,</p></item>
-->
<item><p>eine Achse, welche die Beziehung zwischen den durch den
Lokalisierungsschritt ausgewählten Knoten und dem Kontextknoten
innerhalb des Baumes spezifiziert,</p></item>

<!-- ORIG
<item><p>a node test, which specifies the node type and <termref
def="dt-expanded-name">expanded-name</termref> of the nodes selected
by the location step, and</p></item>
-->
<item><p>einen Knotentest, der den Knotentyp und den <termref
def="dt-expanded-name">erweiterten Namen</termref> der durch den
Lokalisierungsschritt ausgewählten Knoten spezifiziert, sowie</p></item>

<!-- ORIG
<item><p>zero or more predicates, which use arbitrary expressions to
further refine the set of nodes selected by the location
step.</p></item>
-->
<item><p>null oder mehr Prädikate, die mittels beliebiger
Ausdrücke die durch den Lokalisierungsschritt ausgewählte Knotenmenge
weiter verfeinern können.</p>

<transnote>
<p>
Prädikate im mathematischen Sinn sind Aussagen über Eigenschaften, die
für die betreffenden Objekte wahr oder falsch sein können. In diesem 
Sinn wählt ein Prädikat aus einer Knotenmenge genau diejenigen Knoten 
aus, für die die entsprechende Aussage zutrifft.
Aber auch ohne Kenntnis der Begriffswelt der Prädikatenlogik kann man
sich anhand der Begriffe »Prädikatswein« oder »Prädikatsexamen« 
verdeutlichen, dass hier jeweils eine bestimmte Eigenschaft bzw. 
Qualität des beschriebenen Objekts ausgedrückt wird.
</p>
</transnote>
</item>

</ulist>


<!-- ORIG
<p>The syntax for a location step is the axis name and node test
separated by a double colon, followed by zero or more expressions each
in square brackets. For example, in
<code>child::para[position()=1]</code>, <code>child</code> is the name
of the axis, <code>para</code> is the node test and
<code>[position()=1]</code> is a predicate.</p>
-->
<p>Ein Lokalisierungsschritt besteht syntaktisch aus dem Namen der
Achse, gefolgt von zwei Doppelpunkten und dem Knotentest, gefolgt von 
null oder mehr in eckigen Klammern eingeschlossenen Ausdrücken. Zum 
Beispiel enthält <code>child::para[position()=1]</code> die Achse 
<code>child</code>, den Knotentest <code>para</code> und ein Prädikat 
<code>[position()=1]</code>.</p>

<!-- ORIG
<p>The node-set selected by the location step is the node-set that
results from generating an initial node-set from the axis and
node-test, and then filtering that node-set by each of the predicates
in turn.</p>
-->
<p>Die durch den Lokalisierungspfad ausgewählte Knotenmenge ergibt sich
aus der durch Achse und Knotentest bestimmten Ausgangsknotenmenge,
indem dort der Reihe nach die einzelnen Prädikate angewendet werden.</p>

<!-- ORIG
<p>The initial node-set consists of the nodes having the relationship
to the context node specified by the axis, and having the node type
and <termref def="dt-expanded-name">expanded-name</termref> specified
by the node test.  For example, a location step
<code>descendant::para</code> selects the <code>para</code> element
descendants of the context node: <code>descendant</code> specifies
that each node in the initial node-set must be a descendant of the
context; <code>para</code> specifies that each node in the initial
node-set must be an element named <code>para</code>.  The available
axes are described in <specref ref="axes"/>.  The available node tests
are described in <specref ref="node-tests"/>.  The meaning of some
node tests is dependent on the axis.</p>
-->
<p>Die Ausgangsknotenmenge enthält alle Knoten, die zum Kontextknoten
in der durch die Achse angegebenen Beziehung stehen und die den im
Knotentest spezifizierten Knotentyp und 
<termref def="dt-expanded-name">erweiterten Namen</termref> besitzen.
Zum Beispiel wählt der Lokalisierungsschritt 
<code>descendant::para</code> alle <code>para</code>-Nachkommen des
Kontextknotens aus: <code>descendant</code> besagt, dass jeder Knoten
in der Ausgangsknotenmenge ein Nachkomme des Kontextknotens sein muss;
<code>para</code> besagt, dass jeder Knoten in der Ausgangsknotenmenge
ein Element mit dem Namen <code>para</code> sein muss. Die verfügbaren
Achsen werden in <specref ref="axes"/> beschrieben, die verfügbaren
Knotentests in <specref ref="node-tests"/>. Die Bedeutung einiger
Knotentests hängt von der jeweiligen Achse ab.</p>

<!-- ORIG
<p>The initial node-set is filtered by the first predicate to generate
a new node-set; this new node-set is then filtered using the second
predicate, and so on. The final node-set is the node-set selected by
the location step. The axis affects how the expression in each
predicate is evaluated and so the semantics of a predicate is defined
with respect to an axis.  See <specref ref="predicates"/>.</p>
-->
<p>Die Ausgangsknotenmenge wird durch das erste Prädikat gefiltert
und ergibt eine neue Knotenmenge. Diese wird anschließend durch das
zweite Prädikat gefiltert und so weiter. Die resultierende
Knotenmenge ist schließlich die Knotenmenge, die durch den 
Lokalisierungsschritt ausgewählt wird. Die Achse beeinflusst, wie der
Ausdruck in jedem Prädikat berechnet wird. Die Semantik eines
Prädikats ist damit bezüglich einer Achse definiert
(siehe <specref ref="predicates"/>).</p>

<transnote>
<p>
Dieser letzte Satz bezieht sich auf Prädikate, die die 
<termref def="dt-context-position">Kontextposition</termref> und damit 
die <termref def="dt-proximity-position">Näheposition</termref> der 
gefilterten Knoten auswerten.
</p><p>
Zur Verdeutlichung der Vorgehensweise bei mehreren Prädikaten sei
auf die beiden bereits diskutierten Beispiele
</p>
<eg>child::para[attribute::type="warning"][position()=5]</eg>
<p>und</p>
<eg>child::para[position()=5][attribute::type="warning"]</eg>
<p>
in Kapitel <specref ref="location-paths" /> verwiesen.
</p>
</transnote>

<scrap>
<!-- ORIG
<head>Location Steps</head>
-->
<head>Lokalisierungsschritte</head>
<prodgroup pcw5="1" pcw2="10" pcw4="18">
<prod id="NT-Step">
<lhs>Step</lhs>
<rhs><nt def="NT-AxisSpecifier">AxisSpecifier</nt>
<nt def="NT-NodeTest">NodeTest</nt>
<nt def="NT-Predicate">Predicate</nt>*</rhs>
<rhs>| <nt def="NT-AbbreviatedStep">AbbreviatedStep</nt></rhs>
</prod>
<prod id="NT-AxisSpecifier">
<lhs>AxisSpecifier</lhs>
<rhs><nt def="NT-AxisName">AxisName</nt> '::'</rhs>
<rhs>| <nt def="NT-AbbreviatedAxisSpecifier">AbbreviatedAxisSpecifier</nt>
</rhs>
</prod>
</prodgroup>
</scrap>

</div2>

<div2 id="axes">
<!-- ORIG
<head>Axes</head>
-->
<head>Achsen</head>

<!-- ORIG
<p>The following axes are available:</p>
-->
<p>Es stehen die folgenden Achsen zur Verfügung:</p>

<ulist>

<!-- ORIG
<item><p>the <code>child</code> axis contains the children of the
context node</p></item>
-->
<item><p>Die Achse <code>child</code> enthält die Kinder des
Kontextknotens.</p>
<transnote>
<graphic source="images/axis-child.gif" alt="child-Achse" 
         role="screenonly" />
<graphic source="child.eps" alt="child-Achse" role="printonly" />
<p>
Die Kreise, die hier und bei den folgenden Achsen zur Darstellung der 
einzelnen Knoten genutzt werden, repräsentieren keine speziellen 
Knotentypen. Es könnte sich also sowohl um Elemente als auch um 
Textknoten, Kommentare oder Processing Instructions handeln. Sie 
repräsentieren allerdings niemals Attribut- oder Namensraumknoten, da 
diese nur über eigens dafür definierte Achsen erreicht werden können. 
Insbesondere sind es keine Kinder anderer Knoten.
</p><p>
Die Nummern geben die <termref
def="dt-proximity-position">Näheposition</termref> der Knoten in der
durch die Achse ausgewählten Knotenmenge an.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>the <code>descendant</code> axis contains the descendants of
the context node; a descendant is a child or a child of a child and so
on; thus the descendant axis never contains attribute or namespace
nodes</p></item>
-->
<item><p>Die Achse <code>descendant</code> enthält die Nachkommen des
Kontextknotens; ein Nachkomme ist ein Kind oder ein Kind eines
Kindes usw. Die Nachkommenachse enthält niemals Attribut- oder
Namensraumknoten.</p>
<transnote>
<graphic source="images/axis-descendant.gif" alt="descendant-Achse"
         role="screenonly"/>
<graphic source="desc.eps" alt="descendant-Achse" role="printonly"/>
</transnote>
</item>

<!-- ORIG
<item><p>the <code>parent</code> axis contains the <termref
def="dt-parent">parent</termref> of the context node, if there is
one</p></item>
-->
<item><p>Die Achse <code>parent</code> enthält den <termref
def="dt-parent">Elternknoten</termref> des Kontextknotens, falls es
einen gibt.</p>
<transnote>
<graphic source="images/axis-parent.gif" alt="parent-Achse" 
         role="screenonly" />
<graphic source="parent.eps" alt="parent-Achse" role="printonly" />
<p>
Bis auf den Wurzelknoten besitzt jeder Knoten einen Elternknoten.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>the <code>ancestor</code> axis contains the ancestors of the
context node; the ancestors of the context node consist of the
<termref def="dt-parent">parent</termref> of context node and the
parent's parent and so on; thus, the ancestor axis will always include
the root node, unless the context node is the root node</p></item>
-->
<item><p>Die Achse <code>ancestor</code> enthält die Vorfahren des
Kontextknotens; die Vorfahren des Kontextknotens bestehen aus dem
<termref def="dt-parent">Elternknoten</termref> des Kontextknotens,
dessen Elternknoten usw. Die Vorfahrenachse enthält somit immer den
Wurzelknoten, es sei denn, der Kontextknoten selbst ist der 
Wurzelknoten.</p>
<transnote>
<graphic source="images/axis-ancestor.gif" alt="ancestor-Achse"
         role="screenonly"/>
<graphic source="anc.eps" alt="ancestor-Achse" role="printonly"/>
</transnote>
</item>

<!-- ORIG
<item><p>the <code>following-sibling</code> axis contains all the
following siblings of the context node; if the
context node is an attribute node or namespace node, the
<code>following-sibling</code> axis is empty</p></item>
-->
<item><p>Die Achse <code>following-sibling</code> enthält alle
nachfolgenden Geschwister des Kontextknotens; falls der Kontextknoten
ein Attribut- oder Namensraumknoten ist, ist diese Achse leer.</p>
<transnote>
<graphic source="images/axis-following-sibling.gif" 
         alt="following-sibling-Achse" role="screenonly" />
<graphic source="follsib.eps" 
         alt="following-sibling-Achse" role="printonly" />
<p>
Geschwister sind die Knoten, die den gleichen Elternknoten wie der 
Kontextknoten besitzen.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>the <code>preceding-sibling</code> axis contains all the
preceding siblings of the context node; if the context node is an
attribute node or namespace node, the <code>preceding-sibling</code>
axis is empty</p></item>
-->
<item><p>Die Achse <code>preceding-sibling</code> enthält alle
vorhergehenden Geschwister des Kontextknotens; falls der Kontextknoten
ein Attribut- oder Namensraumknoten ist, ist diese Achse leer.</p>
<transnote>
<graphic source="images/axis-preceding-sibling.gif" 
         alt="preceding-sibling-Achse" role="screenonly" />
<graphic source="precsib.eps" 
         alt="preceding-sibling-Achse" role="printonly" />
</transnote>
</item>

<!-- ORIG
<item><p>the <code>following</code> axis contains all nodes in the
same document as the context node that are after the context node in
document order, excluding any descendants and excluding attribute
nodes and namespace nodes</p></item>
-->
<item><p>Die Achse <code>following</code> enthält alle Knoten im
gleichen Dokument wie der Kontextknoten, die nach dem Kontextknoten
in Dokumentordnung auftreten, und zwar ohne seine Nachkommen und ohne
Attribut- und Namensraumknoten.</p>
<transnote>
<graphic source="images/axis-following.gif" alt="following-Achse"
         role="screenonly" />
<graphic source="foll.eps" alt="following-Achse"
         role="printonly" />
</transnote>
</item>

<!-- ORIG
<item><p>the <code>preceding</code> axis contains all nodes in the
same document as the context node that are before the context node in
document order, excluding any ancestors and excluding attribute nodes
and namespace nodes</p></item>
-->
<item><p>Die Achse <code>preceding</code> enthält alle Knoten im
gleichen Dokument wie der Kontextknoten, die vor dem Kontextknoten
in Dokumentordnung auftreten, und zwar ohne seine Vorfahren und ohne
Attribut- und Namensraumknoten.</p>
<transnote>
<graphic source="images/axis-preceding.gif" alt="preceding-Achse"
         role="screenonly" />
<graphic source="prec.eps" alt="preceding-Achse"
         role="printonly" />
</transnote>
</item>

<!-- ORIG
<item><p>the <code>attribute</code> axis contains the attributes of
the context node; the axis will be empty unless the context node is an
element</p></item>
-->
<item><p>Die Achse <code>attribute</code> enthält die Attribute des
Kontextknotens; diese Achse ist leer, es sei denn, der Kontextknoten
ist ein Elementknoten.</p></item>

<!-- ORIG
<item><p>the <code>namespace</code> axis contains the namespace nodes
of the context node; the axis will be empty unless the context node
is an element</p></item>
-->
<item><p>Die Achse <code>namespace</code> enthält alle Namensraumknoten
des Kontextknotens; diese Achse ist leer, es sei denn, der Kontextknoten
ist ein Elementknoten.</p></item>

<!-- ORIG
<item><p>the <code>self</code> axis contains just the context node
itself</p></item>
-->
<item><p>Die Achse <code>self</code> enthält nur den Kontextknoten
selbst.</p>
<transnote>
<graphic source="images/axis-self.gif" alt="self-Achse"
         role="screenonly" />
<graphic source="self.eps" alt="self-Achse" role="printonly" />
</transnote>
</item>

<!-- ORIG
<item><p>the <code>descendant-or-self</code> axis contains the context
node and the descendants of the context node</p></item>
-->
<item><p>Die Achse <code>descendant-or-self</code> enthält den
Kontextknoten sowie die Nachkommen des Kontextknotens.</p>
<transnote>
<graphic source="images/axis-descendant-or-self.gif" 
         alt="descendant-or-self-Achse" role="screenonly" />
<graphic source="descself.eps" 
         alt="descendant-or-self-Achse" role="printonly" />
</transnote>
</item>

<!-- ORIG
<item><p>the <code>ancestor-or-self</code> axis contains the context
node and the ancestors of the context node; thus, the ancestor axis
will always include the root node</p></item>
-->
<item><p>Die Achse <code>ancestor-or-self</code> enthält den
Kontextknoten sowie die Vorfahren des Kontextknotens; diese Achse
enthält somit immer den Wurzelknoten.</p>
<transnote>
<graphic source="images/axis-ancestor-or-self.gif" 
         alt="ancestor-or-self-Achse" role="screenonly" />
<graphic source="ancself.eps" 
         alt="ancestor-or-self-Achse" role="printonly" />
</transnote>
</item>

</ulist>

<!-- ORIG
<note><p>The <code>ancestor</code>, <code>descendant</code>,
<code>following</code>, <code>preceding</code> and <code>self</code>
axes partition a document (ignoring attribute and namespace nodes):
they do not overlap and together they contain all the nodes in the
document.</p></note>
-->
<note><p>Die Achsen <code>ancestor</code>, <code>descendant</code>,
<code>following</code>, <code>preceding</code> und <code>self</code>
partitionieren ein Dokument (unter Auslassung der Attribut- und
Namensraumknoten): sie überschneiden sich nicht und enthalten zusammen
alle Knoten des Dokuments.</p></note>
<transnote>
<graphic source="images/partition.gif" 
         alt="Achsen-Aufteilung eines Dokuments" role="screenonly" />
<graphic source="part.eps" 
         alt="Achsen-Aufteilung eines Dokuments" role="printonly" />
</transnote>

<scrap>
<!-- ORIG
<head>Axes</head>
-->
<head>Achsen</head>
<prod id="NT-AxisName">
<lhs>AxisName</lhs>
<rhs>'ancestor'</rhs>
<rhs>| 'ancestor-or-self'</rhs>
<rhs>| 'attribute'</rhs>
<rhs>| 'child'</rhs>
<rhs>| 'descendant'</rhs>
<rhs>| 'descendant-or-self'</rhs>
<rhs>| 'following'</rhs>
<rhs>| 'following-sibling'</rhs>
<rhs>| 'namespace'</rhs>
<rhs>| 'parent'</rhs>
<rhs>| 'preceding'</rhs>
<rhs>| 'preceding-sibling'</rhs>
<rhs>| 'self'</rhs>
</prod>
</scrap>

<transnote>
<p>
Attribut- und Namensraumachse nehmen hier eine Sonderrolle ein. Die 
adressierten Knoten zeichnen sich nämlich durch einen bestimmten festen
Knotentyp aus (den so genannten <termref
def="dt-principal-node-type">Hauptknotentyp</termref>). Da diese Knoten
per Definition keine Kinder anderer Knoten sind, wurden die speziellen 
Achsen <code>attribute</code> und <code>namespace</code> definiert. 
Trotzdem kann sich auch an diese Achsen ein beliebiger Knotentest 
anschließen (siehe <specref ref="node-tests" />). Dies birgt die Gefahr,
dass zwar syntaktisch korrekte, aber sinnlose Lokalisierungsschritte 
benutzt werden können, die niemals einen Knoten auswählen. Der 
Lokalisierungsschritt <code>attribute::text()</code>, der über die 
Attributachse einen Textknoten auswählen soll, liefert beispielsweise 
immer eine leere Knotenmenge.
</p>
</transnote>
</div2>

<div2 id="node-tests">
<!-- ORIG
<head>Node Tests</head>
-->
<head>Knotentests</head>

<!-- ORIG
<p><termdef id="dt-principal-node-type" term="Principal Node
Type">Every axis has a <term>principal node type</term>.  If an axis
can contain elements, then the principal node type is element;
otherwise, it is the type of the nodes that the axis can
contain.</termdef> Thus,</p>
-->
<p><termdef id="dt-principal-node-type" term="Hauptknotentyp">Jede
Achse besitzt einen <term>Hauptknotentyp</term>. Falls eine
Achse Elemente enthalten kann, so ist der Hauptknotentyp der
Elementtyp, ansonsten ist es genau der Typ der Knoten, die die Achse
enthalten kann.</termdef> Das bedeutet:</p>

<!-- ORIG
<slist>

<sitem>For the attribute axis, the principal node type is attribute.</sitem>

<sitem>For the namespace axis, the principal node type is namespace.</sitem>

<sitem>For other axes, the principal node type is element.</sitem>

</slist>
-->
<slist>

<sitem>Für die Attributachse ist der Hauptknotentyp der 
Attributtyp.</sitem>

<sitem>Für die Namensraumachse ist der Hauptknotentyp der
Namensraum-Typ.</sitem>

<sitem>Für alle anderen Achsen ist der Hauptknotentyp der
Elementtyp.</sitem>

</slist>

<!-- ORIG
<p>A node test that is a <xnt href="&XMLNames;#NT-QName">QName</xnt>
is true if and only if the type of the node (see <specref ref="data-model"/>)
is the principal node type and has
an <termref def="dt-expanded-name">expanded-name</termref> equal to
the <termref def="dt-expanded-name">expanded-name</termref> specified
by the <xnt href="&XMLNames;#NT-QName">QName</xnt>.  For example,
<code>child::para</code> selects the <code>para</code> element
children of the context node; if the context node has no
<code>para</code> children, it will select an empty set of nodes.
<code>attribute::href</code> selects the <code>href</code> attribute
of the context node; if the context node has no <code>href</code>
attribute, it will select an empty set of nodes.</p>
-->
<p>Ein Knotentest, der ein <xnt href="&XMLNames;#NT-QName">QName</xnt>
ist, ist genau dann erfüllt, wenn der Knotentyp (siehe 
<specref ref="data-model"/>) der Hauptknotentyp ist und einen
<termref def="dt-expanded-name">erweiterten Namen</termref> besitzt,
der gleich dem <termref def="dt-expanded-name">erweiterten 
Namen</termref> des 
<xnt href="&XMLNames;#NT-QName">QName</xnt> ist.
Beispielsweise wählt <code>child::para</code> die
<code>para</code>-Kindelemente des Kontextknotens aus. Falls der
Kontextknoten keine <code>para</code>-Kinder besitzt, ist das
Ergebnis eine leere Knotenmenge. <code>attribute::href</code> wählt
die <code>href</code>-Attribute des Kontextknotens aus. Falls der
Kontextknoten keine <code>href</code>-Attribute besitzt, ist das
Ergebnis eine leere Knotenmenge.</p>
<transnote>
<p>
Das Akronym <xnt href="&XMLNames;#NT-QName">QName</xnt> steht für 
<quote>qualifizierter Name</quote> und bedeutet, dass der entsprechende
Name aus einem optionalen Präfix und einem lokalen Bestandteil bestehen
kann. Beide Teile werden durch einen Doppelpunkt voneinander getrennt. 
Durch das Präfix wird der Namensraum bestimmt, zu dem der lokale Name 
gehört. Im Beispiel <code>xlink:href</code> ist <code>xlink</code> das
Präfix und <code>href</code> der lokale Bestandteil.
Die obigen Beispiele verwenden Knotentests, die letztendlich nur
lokale Namen sind, also keine Namensräume berücksichtigen.
</p><p>
Möchte man auf das <code>href</code>-Attribut aus dem 
<code>xlink</code>-Namensraum zugreifen,
wäre also zu schreiben: <code>attribute::xlink:href</code>.
Entsprechend greift man per <code>preceding-sibling::xhtml:h1</code>
auf die dem Kontextknoten vorhergehenden <code>h1</code>-Elemente aus 
dem <code>xhtml</code>-Namensraum zu.
Schließlich ein Beispiel für die Namensraumachse:
<code>namespace::xlink</code> wählt genau den Namensraumknoten aus,
der zum Präfix <code>xlink</code> gehört. Der qualifizierte Name eines 
Namensraumknotens enthält übrigens niemals ein Präfix, siehe 
<specref ref="namespace-nodes" />.
</p><p>
Wie in den Beispielen am Beginn des Kapitels bereits gezeigt wurde, 
eignet sich die Achse <code>self</code>, um innerhalb eines Prädikats 
bestimmte Elementtypen aus einer Knotenmenge herauszufiltern, wie z.B.
in <code>child::*[self::chapter or self::appendix]</code>.
Leider funktioniert eine analoge Vorgehensweise für Attribut- oder
Namensraumknoten nicht. Das erweist sich insbesondere bei negativen 
Bedingungen als hinderlich. Möchte man z.B. alle Attribute bis 
auf das <code>href</code>-Attribut auswählen, leistet
<code>attribute::*[not(self::href)]</code> leider nicht das Gewünschte.
Dieser Ausdruck liefert nämlich nach wie vor alle Attribute. Da die 
<code>self</code>-Achse Elemente enthalten kann, ihr <termref
def="dt-principal-node-type">Hauptknotentyp</termref>
somit der Elementtyp ist, sucht der Ausdruck <code>self::href</code> 
immer nach einem Element mit dem Namen <code>href</code>, niemals nach 
einem Attribut. Eine Lösung für dieses Problem besteht in der 
Auswertung des Attributnamens, siehe die Funktionen 
<function>name</function> und <function>local-name</function>.
</p>
</transnote>

<!-- ORIG
<p>A <xnt href="&XMLNames;#NT-QName">QName</xnt> in the node test is
expanded into an <termref
def="dt-expanded-name">expanded-name</termref> using the namespace
declarations from the expression context.  This is the same way
expansion is done for element type names in start and end-tags except
that the default namespace declared with <code>xmlns</code> is not
used: if the <xnt href="&XMLNames;#NT-QName">QName</xnt> does not have
a prefix, then the namespace URI is null (this is the same way
attribute names are expanded).  It is an error if the <xnt
href="&XMLNames;#NT-QName">QName</xnt> has a prefix for which there is
no namespace declaration in the expression context.</p>
-->
<p>Ein <xnt href="&XMLNames;#NT-QName">QName</xnt> im Knotentest wird
in einen <termref def="dt-expanded-name">erweiterten Namen</termref> 
unter Verwendung der Namensraumdeklarationen aus dem Kontext des 
Ausdrucks expandiert. Dies geschieht in der gleichen Weise wie bei 
Elementnamen in Start- und End-Tags, allerdings mit der Ausnahme, dass 
ein mit <code>xmlns</code> deklarierter voreingestellter Namensraum
nicht genutzt wird: d.h. enthält 
<xnt href="&XMLNames;#NT-QName">QName</xnt> kein Präfix, so ist der 
Namensraum-URI leer (das ist die gleiche Regel, nach der auch 
Attributnamen expandiert werden). Es ist ein Fehler, wenn der 
<xnt href="&XMLNames;#NT-QName">QName</xnt> ein Präfix enthält, für das
es keine Namensraumdeklaration im Kontext des Ausdrucks gibt.</p>
<transnote>
<p>
Qualifizierte Namen werden also gemäß der Namensraum-Empfehlung 
<bibref ref="XMLNAMES" /> expandiert. Das bedeutet insbesondere, dass 
in einem XPath-Ausdruck nicht das gleiche Präfix wie im betrachteten
XML-Dokument benutzt werden muss. Wichtig ist nur, dass beide
Präfixe den gleichen Namensraum repräsentieren.
Wenn beispielsweise das zugrunde liegende XML-Dokument ein
XHTML-Dokument ist, dessen Elemente zum Namensraum 
<code>http://www.w3.org/1999/xhtml</code> gehören, so kann 
beispielsweise das Dokumentelement über den XPath-Ausdruck 
<code>/child::xhtml:html</code>
ausgewählt werden &ndash; vorausgesetzt, das Präfix <code>xhtml</code> 
wurde im Kontext des Ausdrucks an den gleichen Namensraum gebunden. 
Dabei ist es völlig unerheblich, welches Präfix im XHTML-Dokument
benutzt wurde &ndash; es ist sogar möglich, dass dort nur eine 
Deklaration für den voreingestellten Namensraum vorkommt:
<code><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">]]></code>.
</p><p>
Gerade in diesen Fällen ist Vorsicht geboten. Sehr leicht übersieht
man eine solche Namensraumdeklaration, die sich selbstverständlich
auch auf alle Kindelemente auswirkt, und ist gewillt, nur den
jeweiligen Elementnamen in einem Ausdruck anzugeben, z.B.
bei folgender XSLT-Anweisung: 
<code><![CDATA[<xsl:value-of select="title" />]]></code>.
Richtig wäre stattdessen (der Vollständigkeit halber mit
Namensraumdeklaration):
<code><![CDATA[<xsl:value-of select="xhtml:title" 
xmlns:xhtml="http://www.w3.org/1999/xhtml">]]></code>.
Entsprechend müssen in Lokalisierungpfaden alle Schritte vollständig 
qualifiziert sein: <code>xhtml:div/xhtml:p</code>.
</p><p>
Stellt man fest, dass XPath-Ausdrücke nach dem Einfügen einer DTD in
das Originaldokument nicht mehr die richtigen Knoten zurückliefern
(was sich beispielsweise darin äußert, dass ein XSLT-Stylesheet nicht
mehr die erwartete Ausgabe liefert), ist in der Regel ebenfalls die
Deklaration eines voreingestellten Namensraums die Ursache. Eine 
Deklaration innerhalb der DTD der Form 
<code><![CDATA[<!ATTLIST html xmlns CDATA #FIXED "http://www.w3.org/1999/xhtml">]]></code>
versetzt alle Kindelemente von <code>html</code> ohne Präfix und auch 
<code>html</code> selbst in den XHTML-Namensraum. Ohne die DTD gehören
sie keinem Namensraum an. In solchen Fällen sollte man die Deklaration 
des voreingestellten Namensraums in das XML-Dokument aufnehmen, damit 
XPath-Ausdrücke unabhängig von der Auswertung einer DTD immer das 
gleiche Ergebnis liefern.
</p><p>
Schließlich sei noch einmal darauf hingewiesen, dass sich ein
voreingestellter Namensraum im Kontext eines XPath-Ausdrucks nicht auf 
den Ausdruck auswirkt. Ein qualifizierter Name ohne Präfix adressiert
damit immer ein Element oder ein Attribut, das zu keinem Namensraum
gehört. Die folgende Variante ist damit <emph>keine</emph> Alternative
zum obigen Beispiel:
<code><![CDATA[
   <xsl:value-of select="title" 
                 xmlns="http://www.w3.org/1999/xhtml">]]></code>.
</p>
</transnote>

<!-- ORIG
<p>A node test <code>*</code> is true for any node of the principal
node type.  For example, <code>child::*</code> will select all element
children of the context node, and <code>attribute::*</code> will
select all attributes of the context node.</p>
-->
<p>Ein Knotentest <code>*</code> ist für jeden Knoten des
Hauptknotentyps erfüllt. Beispielsweise wählt <code>child::*</code>
alle Kindelemente und <code>attribute::*</code> alle Attributknoten des
Kontextknotens aus.</p>

<transnote>
<p>
Handelt es sich beim Kontextknoten um einen Elementknoten, so liefert
der Schritt <code>parent::*</code> nur dann die leere Knotenmenge, wenn
dieser das Dokumentelement repräsentiert. Der Elementknoten für das
Dokumentelement besitzt zwar ebenfalls einen Elternknoten, nämlich
die Wurzel <code>/</code>, diese ist aber nicht vom 
<termref def="dt-principal-node-type">Hauptknotentyp</termref> der 
Achse <code>parent</code>, dem Elementtyp.
</p>
</transnote>

<!-- ORIG
<p>A node test can have the form <xnt
href="&XMLNames;#NT-NCName">NCName</xnt><code>:*</code>.  In this
case, the prefix is expanded in the same way as with a <xnt
href="&XMLNames;#NT-QName">QName</xnt>, using the context namespace
declarations.  It is an error if there is no namespace declaration for
the prefix in the expression context.  The node test will be true for
any node of the principal type whose <termref
def="dt-expanded-name">expanded-name</termref> has the namespace URI
to which the prefix expands, regardless of the local part of the
name.</p>
-->
<p>Ein Knotentest kann in der Form <xnt
href="&XMLNames;#NT-NCName">NCName</xnt><code>:*</code> auftreten. In
diesem Fall wird das Präfix wie bei einem <xnt
href="&XMLNames;#NT-QName">QName</xnt> unter Verwendung der
Namensraumdeklarationen des Kontextes expandiert. Es ist ein Fehler,
wenn es für das Präfix keine Namensraumdeklaration im Kontext
des Ausdrucks gibt. Der Knotentest ist erfüllt für jeden Knoten des
Hauptknotentyps, dessen <termref def="dt-expanded-name">erweiterter 
Name</termref> den Namensraum-URI besitzt, zu dem das Präfix expandiert,
unabhängig vom lokalen Bestandteil des Namens.</p>
<transnote>
<p>
Beispielsweise wählt <code>descendant::xhtml:*</code> alle Nachkommen
aus dem <code>xhtml</code>-Namensraum und 
<code>attribute::xlink:*</code> alle Attribute aus dem
<code>xlink</code>-Namensraum aus.
</p><p>
Diese Form von Knotentests kann in einem XSLT-Stylesheet innerhalb
eines Musters z.B. dazu genutzt werden, alle Elemente eines
bestimmten Namensraums in der gleichen Weise zu behandeln. 
Eingebettete XHTML-Elemente in einem beliebigen zu transformierenden
XML-Dokument können auf diese Weise einfach in die Ausgabe kopiert
werden, ohne dass diese Elemente explizit benannt werden müssen.
</p>
</transnote>

<!-- ORIG
<p>The node test <code>text()</code> is true for any text node. For
example, <code>child::text()</code> will select the text node
children of the context node.  Similarly, the node test
<code>comment()</code> is true for any comment node, and the node test
<code>processing-instruction()</code> is true for any processing
instruction. The <code>processing-instruction()</code> test may have
an argument that is <nt def="NT-Literal">Literal</nt>; in this case, it
is true for any processing instruction that has a name equal to the
value of the <nt def="NT-Literal">Literal</nt>.</p>
-->
<p>Der Knotentest <code>text()</code> ist erfüllt für jeden Textknoten.
Zum Beispiel wählt <code>child::text()</code> alle Textknoten aus, die
Kinder des Kontextknotens sind. Analog ist der Knotentest
<code>comment()</code> für jeden Kommentarknoten erfüllt und der
Knotentest <code>processing-instruction()</code> für jede
Processing Instruction. Dem Test <code>processing-instruction()</code>
kann ein <nt def="NT-Literal">Literal</nt> als Argument übergeben
werden. In diesem Fall ist der Test für jede Processing Instruction
erfüllt, deren Name gleich dem Wert des übergebenen
<nt def="NT-Literal">Literals</nt> ist.</p>
<transnote>
<p>
Offensichtlich werden Kommentare nicht einfach ignoriert, sondern durch
eigene Knoten innerhalb des XML-Baumes repräsentiert. Auf diese Weise 
können XPath-Ausdrücke mittels <code>comment()</code> auch auf 
Kommentarknoten zugreifen. Ein Stylesheet kann damit XML-Kommentare
verarbeiten und diese geeignet darstellen.
</p><p>
Für Processing Instructions gibt es ebenfalls entsprechende Knoten im 
XML-Baum. Jede Processing Instruction besitzt einen Namen (ein Ziel),
z.B. <code>xml-stylesheet</code> in 
<code>&lt;?xml-stylesheet href=... ?&gt;</code>.
Wird dieser Name im Knotentest <code>processing-instruction()</code>
angegeben, ist der entsprechende Test nur für Processing Instructions 
mit gleichem Namen erfüllt. Namen von Processing Instructions werden 
dabei nicht von Namensraumdeklarationen beeinflusst. Das Argument für 
<code>processing-instruction()</code> ist damit kein qualifizierter 
Name, sondern ein Zeichenkettenliteral. Der Knotentest für die zitierte
Processing Instruction lautet z.B.
<code>processing-instruction('xml-stylesheet')</code>.
</p>
</transnote>

<!-- ORIG
<p>A node test <code>node()</code> is true for any node of any type
whatsoever.</p>
-->
<p>Der Knotentest <code>node()</code> ist für alle Knoten jedes 
beliebigen Typs erfüllt.</p>

<transnote>
<p>
Möchte man alle Knoten eines Dokuments auswählen, kann man z.B.
die folgenden Knotenmengen vereinigen:
<code>/descendant-or-self::node()</code>,
<code>/descendant-or-self::node()/attribute::*</code> und
<code>/descendant-or-self::node()/namespace::*</code>.
</p><p>
Es wurde bereits auf die Sonderrolle von Attribut- und Namensraumknoten
hingewiesen. Diese werden nicht durch einen Knotentest, sondern durch
entsprechende Achsen ausgewählt. Das hat zur Folge, dass sich zwar
einfach prüfen lässt, ob der Kontextknoten z.B. ein Textknoten ist
(per <code>self::text()</code>; analog für Element-, Kommentar- und 
Processing-Instruction-Knoten), allerdings funktioniert diese Methode 
nicht bei Attribut- und Namensraumknoten. Hier muss man stattdessen 
überprüfen, ob sich der Kontextknoten in der Menge der Attribut- bzw. 
Namensraumknoten des Elternknotens befindet,
siehe <specref ref="node-sets" />.
</p>
</transnote>

<scrap>
<head></head>
<prod id="NT-NodeTest">
<lhs>NodeTest</lhs>
<rhs><nt def="NT-NameTest">NameTest</nt></rhs>
<rhs>| <nt def="NT-NodeType">NodeType</nt> '(' ')'</rhs>
<rhs>| 'processing-instruction' '(' <nt def="NT-Literal">Literal</nt> ')'</rhs>
</prod>
</scrap>

</div2>

<div2 id="predicates">
<!-- ORIG
<head>Predicates</head>
-->
<head>Prädikate</head>

<!-- ORIG
<p>An axis is either a forward axis or a reverse axis.  An axis that
only ever contains the context node or nodes that are after the
context node in <termref def="dt-document-order">document
order</termref> is a forward axis.  An axis that only ever contains
the context node or nodes that are before the context node in <termref
def="dt-document-order">document order</termref> is a reverse axis.
Thus, the ancestor, ancestor-or-self, preceding, and preceding-sibling
axes are reverse axes; all other axes are forward axes. Since the self
axis always contains at most one node, it makes no difference whether
it is a forward or reverse axis.  <termdef term="Proximity Position"
id="dt-proximity-position">The <term>proximity position</term> of a
member of a node-set with respect to an axis is defined to be the
position of the node in the node-set ordered in document order if the
axis is a forward axis and ordered in reverse document order if the
axis is a reverse axis. The first position is 1.</termdef></p>
-->
<p>Eine Achse ist entweder vorwärts- oder rückwärtsgerichtet. Eine 
vorwärtsgerichtete Achse enthält immer nur den Kontextknoten oder 
Knoten, die nach dem Kontextknoten im Dokument auftreten. Eine 
rückwärtsgerichtete Achse enthält immer nur den Kontextknoten oder
Knoten, die vor dem Kontextknoten im Dokument auftreten.
Demzufolge sind die Achsen 
<code>ancestor</code>, <code>ancestor-or-self</code>,
<code>preceding</code> und <code>preceding-sibling</code>
rückwärtsgerichtete Achsen. Alle anderen Achsen sind vorwärtsgerichtet.
Da die Achse <code>self</code> immer höchstens einen Knoten enthält,
hat es keine Bedeutung, ob sie als vorwärts- oder rückwärtsgerichtete
Achse betrachtet wird.
<termdef term="Näheposition" id="dt-proximity-position">Die 
<term>Näheposition</term> eines Knotens in einer Knotenmenge bezüglich 
einer Achse ist definiert als die Position des Knotens in dieser 
Knotenmenge, welche in Dokumentordnung geordnet ist, wenn es sich um
eine vorwärtsgerichtete Achse handelt, und welche in umgekehrter
Dokumentordnung geordnet ist, wenn es sich um eine rückwärtsgerichtete
Achse handelt. Die erste Position ist 1.</termdef></p>
<transnote>
<p>
Diese recht komplizierte Definition bedarf einer Erläuterung.
Die Knoten in einer Knotenmenge sind ungeordnet &ndash; es handelt sich 
schließlich um eine Menge. Allerdings kann über die Funktion
<function>position</function> die Position eines Knotens in der
aktuellen Knotenliste bestimmt werden. Die Reihenfolge der Knoten 
orientiert sich an der Reihenfolge, in der die Knoten im XML-Dokument 
auftreten. Bei vorwärtsgerichteten Achsen wird diese 
Ursprungsreihenfolge beibehalten und man spricht von 
<termref def="dt-document-order">Dokumentordnung</termref>. Für 
rückwärtsgerichtete Achsen wird die Reihenfolge umgekehrt und man 
spricht von <termref def="dt-reverse-document-order">umgekehrter 
Dokumentordnung</termref>.
</p><p>
Die obige Definition hat zur Folge, dass innerhalb eines
Lokalisierungsschrittes immer der nächstgelegene Knoten die 
Position 1 hat. Abhängig von der Blickrichtung kann es sich um einen 
unmittelbaren Vorgänger (<code>preceding</code>) bzw. Vorfahren 
(<code>ancestor</code>) oder aber um einen unmittelbaren Nachfolger 
(<code>following</code>) bzw. Nachkommen (<code>descendant</code>) 
handeln. Der Begriff Näheposition beschreibt damit die Nähe zum 
Kontextknoten. Die Abbildungen zu den verschiedenen Achsen in Kapitel 
<specref ref="axes" /> verdeutlichen die Näheposition der jeweiligen
zur Achse gehörenden Knoten. Genau genommen ist die 
<code>parent</code>-Achse ebenfalls rückwärtsgerichtet, allerdings 
enthält diese wie <code>self</code> maximal einen Knoten.
</p><p>
Die Näheposition ist nur innerhalb von Prädikaten in 
Lokalisierungsschritten von Bedeutung, da hier die ausschlaggebende 
Achse bekannt ist. Die in <specref ref="string-functions" />
vorgestellte Funktion <function>string</function> (ebenso wie die 
Funktionen <function>number</function> und <function>boolean</function>)
konvertiert dagegen bei einer Knotenmenge immer den ersten Knoten
bezüglich der Dokumentordnung, unabhängig davon, auf welchem Weg
diese Knotenmenge gebildet wurde.
</p><p>
Für vorwärtsgerichtete Achsen gilt daher folgende Gleichheit
(am Beispiel <code>following</code>):
</p>
<eg>string(following::p) = string(following::p[position()=1])</eg>
<p>
Dies ist bei rückwärtsgerichteten Achsen nicht der Fall. Stattdessen
gilt hier (am Beispiel <code>preceding</code>):
</p>
<eg>string(preceding::p) = string(preceding::p[position()=last()])</eg>
<p>
Die XSLT-Anweisung <code>xsl:value-of</code> verwendet implizit die
Funktion <function>string</function>, um einen Textknoten zu 
generieren. Will man also auf den Wert des ersten Knotens einer 
rückwärtsgerichteten Achse zugreifen, muss man diesen immer explizit 
durch ein Prädikat auswählen. Die Ausgabe des Wertes eines Attributs 
<code>id</code> des Vorgängerknotens erfolgt daher z.B. durch
<code>&lt;xsl:value-of select="preceding::p[position()=1]/@id" /&gt;</code>.
</p><p>
Für Attribute und Namensraumknoten ist die Diskussion um Position
und Richtung bedeutungslos. Das liegt daran, dass die Reihenfolge,
in der Attribute und Namensraumdeklarationen im Start-Tag eines 
Elements angegeben wurden, als irrelevant angesehen wird.
Informationen darüber sind daher nicht mehr im XML-Baum enthalten.
</p>
</transnote>

<!-- ORIG
<p>A predicate filters a node-set with respect to an axis to produce a
new node-set.  For each node in the node-set to be filtered, the <nt
def="NT-PredicateExpr">PredicateExpr</nt> is evaluated with that node
as the context node, with the number of nodes in the node-set as the
context size, and with the <termref
def="dt-proximity-position">proximity position</termref> of the node
in the node-set with respect to the axis as the context position; if
<nt def="NT-PredicateExpr">PredicateExpr</nt> evaluates to true for
that node, the node is included in the new node-set; otherwise, it is
not included.</p>
-->
<p>Ein Prädikat filtert eine Knotenmenge bezüglich einer Achse und
produziert damit eine neue Knotenmenge. Für jeden zu filternden Knoten 
der Knotenmenge wird der dazugehörige Ausdruck <nt 
def="NT-PredicateExpr">PredicateExpr</nt> berechnet, und zwar mit 
diesem Knoten als Kontextknoten, der Anzahl der Knoten der Knotenmenge 
als Kontextgröße und mit der <termref 
def="dt-proximity-position">Näheposition</termref> des Knotens in der
Knotenmenge bezüglich der Achse als Kontextposition. Falls die
Berechnung von <nt def="NT-PredicateExpr">PredicateExpr</nt> für
diesen Knoten <emph>wahr</emph> ergibt, wird der Knoten in die 
Ergebnisknotenmenge aufgenommen, andernfalls nicht.</p>
<transnote>
<p>
Diese Definition soll anhand eines Beispiels veranschaulicht werden:
</p>
<eg>ancestor::person[position() &gt;= 2]</eg>
<p>
Achse und Knotentest <code>ancestor::person</code> liefern die Menge 
aller <code>person</code>-Elemente, die Vorfahren des Kontextknotens 
sind. Für jeden dieser Elementknoten wird nun der Ausdruck 
<code>position() &gt;= 2</code> berechnet. Die Kontextgröße ist dabei 
die Anzahl aller <code>person</code>-Vorfahren. Da 
<code>ancestor</code> eine rückwärtsgerichtete Achse ist, werden die 
Knoten entgegen der Originalreihenfolge nummeriert. Damit werden alle 
<code>person</code>-Elementknoten bis auf den ersten (d.h. den
nächsten) in die Ergebnisknotenmenge aufgenommen. Da als Knotentest des
Lokalisierungsschrittes <code>person</code> verwendet wurde (und nicht 
<code>*</code>), muss es sich bei diesem ersten 
<code>person</code>-Elementknoten nicht um den Elternknoten handeln. 
Würde sich ein weiteres Prädikat an den obigen Ausdruck anschließen, 
wäre die gerade berechnete Ergebnisknotenmenge Ausgangspunkt für dieses
Prädikat.
</p><p>
Falls der Ausdruck eines nachfolgenden Prädikats nicht auf Kontextgröße
oder -position zugreift, kann dieser Ausdruck bereits im ersten 
Prädikat berechnet und über den logischen Operator <code>and</code> mit
dem dortigen Ausdruck verbunden werden.  Der Lokalisierungsschritt
</p>
<eg>child::chapter[child::title][attribute::type="warning"]</eg>
<p>
liefert damit die gleiche Knotenmenge wie
</p>
<eg>child::chapter[child::title and attribute::type="warning"]</eg>
</transnote>

<!-- ORIG
<p>A <nt def="NT-PredicateExpr">PredicateExpr</nt> is evaluated by
evaluating the <nt def="NT-Expr">Expr</nt> and converting the result
to a boolean.  If the result is a number, the result will be converted
to true if the number is equal to the context position and will be
converted to false otherwise; if the result is not a number, then the
result will be converted as if by a call to the
<function>boolean</function> function.  Thus a location path
<code>para[3]</code> is equivalent to
<code>para[position()=3]</code>.</p>
-->
<p>Ein <nt def="NT-PredicateExpr">PredicateExpr</nt> wird durch 
Berechnung des <nt def="NT-Expr">Expr</nt> und anschließender
Konvertierung des Ergebnisses in einen booleschen Wert bestimmt. Falls 
das Ergebnis eine Zahl war, wird es für den Fall, dass diese Zahl 
gleich der Kontextposition ist, in den Wert <emph>wahr</emph>
konvertiert, ansonsten in den Wert <emph>falsch</emph>. Wenn das
Ergebnis keine Zahl war, dann wird es so 
konvertiert wie bei einem Aufruf der Funktion 
<function>boolean</function>. Damit ist ein Lokalisierungspfad
<code>para[3]</code> äquivalent zu <code>para[position()=3]</code>.</p>
<transnote>
<p>
Da die abgekürzte Syntax erst im folgenden Kapitel beschrieben wird,
sollte als Beispiel hier besser <code>child::para[3]</code> verwendet
werden.
</p><p>
Für Zahlen als Wert eines <nt def="NT-PredicateExpr">PredicateExpr</nt>
gilt hier eine Sonderregel. Diese ermöglicht eine Schreibweise, die
dem Zugriff auf Feldelemente in anderen Programmiersprachen gleicht.
Allerdings muss beachtet werden, dass ein Ausdruck
<code>child::para[$num]</code> nur dann gleichbedeutend mit
<code>child::para[position()=$num]</code> ist, wenn die Variable
<code>num</code> tatsächlich eine Zahl, also ein Objekt vom Typ
<emph>number</emph> enthält. Wenn sie stattdessen nur eine geeignete 
Zeichenkette enthält, wird der Variableninhalt gemäß der Funktion 
<function>boolean</function> in einen booleschen Wert konvertiert. Das 
Gleiche gilt für jedes andere Objekt, das sich in eine Zahl 
konvertieren ließe.
</p>
</transnote>

<scrap>
<!-- ORIG
<head>Predicates</head>
-->
<head>Prädikate</head>
<prod id="NT-Predicate">
<lhs>Predicate</lhs>
<rhs>'[' <nt def="NT-PredicateExpr">PredicateExpr</nt> ']'</rhs>
</prod>
<prod id="NT-PredicateExpr">
<lhs>PredicateExpr</lhs>
<rhs><nt def="NT-Expr">Expr</nt></rhs>
</prod>
</scrap>

</div2>

<div2 id="path-abbrev">
<!-- ORIG
<head>Abbreviated Syntax</head>
-->
<head>Abgekürzte Syntax</head>
<!-- ORIG
<p>Here are some examples of location paths using abbreviated
syntax:</p>
-->
<p>Zunächst einige Beispiele für Lokalisierungspfade, die die
abgekürzte Syntax benutzen:</p>

<ulist>

<!-- ORIG
<item><p><code>para</code> selects the <code>para</code> element children of
the context node</p></item>
-->
<item><p><code>para</code> wählt die <code>para</code>-Kindelemente des
Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>*</code> selects all element children of the
context node</p></item>
-->
<item><p><code>*</code> wählt alle Kindelemente des Kontextknotens
aus.</p></item>

<!-- ORIG
<item><p><code>text()</code> selects all text node children of the
context node</p></item>
-->
<item><p><code>text()</code> wählt alle Textknoten aus, die Kinder des
Kontextknotens sind.</p></item>

<!-- ORIG
<item><p><code>@name</code> selects the <code>name</code> attribute of
the context node</p></item>
-->
<item><p><code>@name</code> wählt das Attribut <code>name</code> des
Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>@*</code> selects all the attributes of the
context node</p></item>
-->
<item><p><code>@*</code> wählt alle Attribute des Kontextknotens 
aus.</p></item>

<!-- ORIG
<item><p><code>para[1]</code> selects the first <code>para</code> child of
the context node</p></item>
-->
<item><p><code>para[1]</code> wählt das erste 
<code>para</code>-Kindelement des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>para[last()]</code> selects the last <code>para</code> child
of the context node</p></item>
-->
<item><p><code>para[last()]</code> wählt das letzte
<code>para</code>-Kindelement des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>*/para</code> selects all <code>para</code> grandchildren of
the context node</p></item>
-->
<item><p><code>*/para</code> wählt alle <code>para</code>-Enkelelemente
des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>/doc/chapter[5]/section[2]</code> selects the second
<code>section</code> of the fifth <code>chapter</code> of the
<code>doc</code></p></item>
-->
<item><p><code>/doc/chapter[5]/section[2]</code> wählt das zweite
<code>section</code>-Element des fünften <code>chapter</code>-Elements
von <code>doc</code> aus.</p></item>

<!-- ORIG
<item><p><code>chapter//para</code> selects the <code>para</code> element
descendants of the <code>chapter</code> element children of the
context node</p></item>
-->
<item><p><code>chapter//para</code> wählt die
<code>para</code>-Elemente aus, die Nachkommen der
<code>chapter</code>-Kindelemente des Kontextknotens sind.</p></item>

<!-- ORIG
<item><p><code>//para</code> selects all the <code>para</code> descendants of
the document root and thus selects all <code>para</code> elements in the
same document as the context node</p></item>
-->
<item><p><code>//para</code> wählt alle <code>para</code>-Nachkommen
der Dokumentwurzel aus und somit alle <code>para</code>-Elemente im
gleichen Dokument wie der Kontextknoten.</p></item>

<!-- ORIG
<item><p><code>//olist/item</code> selects all the <code>item</code>
elements in the same document as the context node that have an
<code>olist</code> parent</p></item>
-->
<item><p><code>//olist/item</code> wählt all die
<code>item</code>-Elemente aus dem gleichen Dokument wie der
Kontextknoten aus, die ein <code>olist</code>-Elternelement
besitzen.</p></item>

<!-- ORIG
<item><p><code>.</code> selects the context node</p></item>
-->
<item><p><code>.</code> wählt den Kontextknoten aus.</p></item>

<!-- ORIG
<item><p><code>.//para</code> selects the <code>para</code> element
descendants of the context node</p></item>
-->
<item><p><code>.//para</code> wählt die <code>para</code>-Elemente aus,
die Nachkommen des Kontextknotens sind.</p></item>

<!-- ORIG
<item><p><code>..</code> selects the parent of the context node</p></item>
-->
<item><p><code>..</code> wählt den Elternknoten des Kontextknotens
aus.</p></item>

<!-- ORIG
<item><p><code>../@lang</code> selects the <code>lang</code> attribute
of the parent of the context node</p></item>
-->
<item><p><code>../@lang</code> wählt das Attribut <code>lang</code>
des Elternknotens des Kontextknotens aus.</p></item>

<!-- ORIG
<item><p><code>para[@type="warning"]</code> selects all <code>para</code>
children of the context node that have a <code>type</code> attribute with
value <code>warning</code></p></item>
-->
<item><p><code>para[@type="warning"]</code> wählt alle
<code>para</code>-Kindelemente des Kontextknotens aus, die ein
Attribut <code>type</code> mit dem Wert <code>warning</code> 
besitzen.</p></item>

<!-- ORIG
<item><p><code>para[@type="warning"][5]</code> selects the fifth
<code>para</code> child of the context node that has a <code>type</code>
attribute with value <code>warning</code></p></item>
-->
<item><p><code>para[@type="warning"][5]</code> wählt das fünfte
<code>para</code>-Kindelement des Kontextknotens aus, das ein Attribut
<code>type</code> mit dem Wert <code>warning</code> besitzt.</p></item>

<!-- ORIG
<item><p><code>para[5][@type="warning"]</code> selects the fifth
<code>para</code> child of the context node if that child has a
<code>type</code> attribute with value <code>warning</code></p></item>
-->
<item><p><code>para[5][@type="warning"]</code> wählt das fünfte
<code>para</code>-Kindelement des Kontextknotens aus, falls dieses
Kind ein Attribut <code>type</code> mit dem Wert <code>warning</code>
besitzt.</p>
</item>

<!-- ORIG
<item><p><code>chapter[title="Introduction"]</code> selects the
<code>chapter</code> children of the context node that have one or
more <code>title</code> children with <termref
def="dt-string-value">string-value</termref> equal to
<code>Introduction</code></p></item>
-->
<item><p><code>chapter[title="Introduction"]</code> wählt die
<code>chapter</code>-Kindelemente des Kontextknotens aus, die ein
oder mehrere <code>title</code>-Kindelemente mit einem <termref
def="dt-string-value">Zeichenkettenwert</termref> gleich
<code>Introduction</code> besitzen.</p>
</item>

<!-- ORIG
<item><p><code>chapter[title]</code> selects the <code>chapter</code>
children of the context node that have one or more <code>title</code>
children</p></item>
-->
<item><p><code>chapter[title]</code> wählt die
<code>chapter</code>-Kindelemente des Kontextknotens aus, die ein
oder mehrere <code>title</code>-Kindelemente besitzen.</p></item>

<!-- ORIG
<item><p><code>employee[@secretary and @assistant]</code> selects all
the <code>employee</code> children of the context node that have both a
<code>secretary</code> attribute and an <code>assistant</code>
attribute</p></item>
-->
<item><p><code>employee[@secretary and @assistant]</code> wählt alle
<code>employee</code>-Kindelemente des Kontextknotens aus, die sowohl
ein Attribut <code>secretary</code> als auch ein Attribut
<code>assistant</code> besitzen.</p></item>

</ulist>

<!-- ORIG
<p>The most important abbreviation is that <code>child::</code> can be
omitted from a location step.  In effect, <code>child</code> is the
default axis.  For example, a location path <code>div/para</code> is
short for <code>child::div/child::para</code>.</p>
-->
<p>Die wichtigste Abkürzung besteht darin, dass <code>child::</code>
in einem Lokalisierungsschritt weggelassen werden kann. 
Die Standardachse ist also <code>child</code>. So steht beispielsweise
ein Lokalisierungspfad <code>div/para</code> abkürzend für
<code>child::div/child::para</code>.</p>

<!-- ORIG
<p>There is also an abbreviation for attributes:
<code>attribute::</code> can be abbreviated to <code>@</code>. For
example, a location path <code>para[@type="warning"]</code> is short
for <code>child::para[attribute::type="warning"]</code> and so selects
<code>para</code> children with a <code>type</code> attribute with
value equal to <code>warning</code>.</p>
-->
<p>Für Attribute gibt es ebenfalls eine Abkürzung: 
<code>attribute::</code> kann zu <code>@</code> abgekürzt werden.
Ein Lokalisierungspfad <code>para[@type="warning"]</code> steht
beispielsweise abkürzend für 
<code>child::para[attribute::type="warning"]</code> und wählt damit
<code>para</code>-Kindelemente mit einem Attribut <code>type</code>
aus, dessen Wert gleich <code>warning</code> ist.</p>

<!-- ORIG
<p><code>//</code> is short for
<code>/descendant-or-self::node()/</code>.  For example,
<code>//para</code> is short for
<code>/descendant-or-self::node()/child::para</code> and so will
select any <code>para</code> element in the document (even a
<code>para</code> element that is a document element will be selected
by <code>//para</code> since the document element node is a child of
the root node); <code>div//para</code> is short for
<code>div/descendant-or-self::node()/child::para</code> and so
will select all <code>para</code> descendants of <code>div</code>
children.</p>
-->
<p><code>//</code> ist die Abkürzung für 
<code>/descendant-or-self::node()/</code>. Zum Beispiel steht
<code>//para</code> abkürzend für
<code>/descendant-or-self::node()/child::para</code> und wählt damit
alle <code>para</code>-Elemente im Dokument aus (selbst ein
<code>para</code>-Element, das ein Dokumentelement ist, wird durch
<code>//para</code> ausgewählt, da der Dokumentelementknoten ein
Kind des Wurzelknotens ist). <code>div//para</code> steht
abkürzend für
<code>div/descendant-or-self::node()/child::para</code> und wählt
daher alle <code>para</code>-Nachfolger von <code>div</code>-Kindern
aus.</p>

<transnote>
<p>
Hier enthält das Originaldokument einen kleinen Fehler. 
Der vollständige Lokalisierungspfad für das letzte Beispiel muss
<code>child::div/descendant-or-self::node()/child::para</code>
lauten.
</p>
</transnote>

<!-- ORIG
<note><p>The location path <code>//para[1]</code> does
<emph>not</emph> mean the same as the location path
<code>/descendant::para[1]</code>.  The latter selects the first
descendant <code>para</code> element; the former selects all descendant
<code>para</code> elements that are the first <code>para</code>
children of their parents.</p></note>
-->
<note><p>Der Lokalisierungspfad <code>//para[1]</code> bedeutet
<emph>nicht</emph> das Gleiche wie <code>/descendant::para[1]</code>.
Der zweite wählt das erste Nachkommenelement <code>para</code> aus,
der erste wählt alle <code>para</code>-Nachkommen aus, die das erste
Kind ihrer Eltern sind.</p></note>
<transnote>
<p>
Davon kann man sich durch Bestimmung des vollständigen Ausdrucks
leicht überzeugen:
</p>
<eg>
//para[1] = /descendant-or-self::node()/para[1]
          = /descendant-or-self::node()/child::para[1]
</eg>
<p>
Das Prädikat <code>[1]</code> wirkt damit auf die durch die
<code>child</code>-Achse im zweiten Lokalisierungsschritt bestimmte 
Knotenmenge, wogegen es in <code>/descendant::para[1]</code> zur
<code>descendant</code>-Achse gehört.
</p>
</transnote>

<!-- ORIG
<p>A location step of <code>.</code> is short for
<code>self::node()</code>. This is particularly useful in
conjunction with <code>//</code>. For example, the location path
<code>.//para</code> is short for</p>
-->
<p>Ein Lokalisierungsschritt <code>.</code> steht abkürzend für
<code>self::node()</code>. Das ist insbesondere in Verbindung mit
<code>//</code> nützlich. Der Lokalisierungspfad <code>.//para</code>
steht zum Beispiel abkürzend für</p>

<eg>self::node()/descendant-or-self::node()/child::para</eg>

<!-- ORIG
<p>and so will select all <code>para</code> descendant elements of the
context node.</p>
-->
<p>und wählt daher alle <code>para</code>-Elemente aus, die Nachkommen
des Kontextknotens sind.</p>

<!-- ORIG
<p>Similarly, a location step of <code>..</code> is short for
<code>parent::node()</code>. For example, <code>../title</code> is
short for <code>parent::node()/child::title</code> and so will
select the <code>title</code> children of the parent of the context
node.</p>
-->
<p>Analog steht der Lokalisierungsschritt <code>..</code> abkürzend
für <code>parent::node()</code>. Zum Beispiel steht 
<code>../title</code> abkürzend für 
<code>parent::node()/child::title</code> und wählt damit die
<code>title</code>-Kindelemente des Elternknotens des Kontextknotens
aus.</p>

<transnote>
<p>
Die Kombination aus <code>.</code> und <code>/</code> ist unnötig und 
kann weggelassen werden. Ausdrücke der Form <code>./title</code> oder 
<code>./@name</code> können kürzer als <code>title</code> 
bzw. <code>@name</code> geschrieben werden.
</p><p>
Ein Blick in die unten stehende Grammatik zeigt, dass es sich bei 
<code>.</code> und <code>..</code> um vollständige 
Lokalisierungsschritte handelt. Ihnen können also keine Prädikate 
folgen. Ausdrücke der Form <code>.[self::par]</code> oder 
<code>..[@name='foo']</code> sind nicht zulässig.
</p>
</transnote>

<scrap>
<!-- ORIG
<head>Abbreviations</head>
-->
<head>Abkürzungen</head>
<prodgroup pcw5="1" pcw2="15" pcw4="16">
<prod id="NT-AbbreviatedAbsoluteLocationPath">
<lhs>AbbreviatedAbsoluteLocationPath</lhs>
<rhs>'//' <nt def="NT-RelativeLocationPath">RelativeLocationPath</nt></rhs>
</prod>
<prod id="NT-AbbreviatedRelativeLocationPath">
<lhs>AbbreviatedRelativeLocationPath</lhs>
<rhs><nt def="NT-RelativeLocationPath">RelativeLocationPath</nt> '//' <nt def="NT-Step">Step</nt></rhs>
</prod>
<prod id="NT-AbbreviatedStep">
<lhs>AbbreviatedStep</lhs>
<rhs>'.'</rhs>
<rhs>| '..'</rhs>
</prod>
<prod id="NT-AbbreviatedAxisSpecifier">
<lhs>AbbreviatedAxisSpecifier</lhs>
<rhs>'@'?</rhs>
</prod>
</prodgroup>
</scrap>

</div2>

</div1>

<div1>
<!-- ORIG
<head>Expressions</head>
-->
<head>Ausdrücke</head>

<div2>
<!-- ORIG
<head>Basics</head>
-->
<head>Grundlagen</head>

<!-- ORIG
<p>A <nt def="NT-VariableReference">VariableReference</nt> evaluates
to the value to which the variable name is bound in the set of
variable bindings in the context.  It is an error if the variable name
is not bound to any value in the set of variable bindings in the
expression context.</p>
-->

<p>Eine Variablenreferenz 
(<nt def="NT-VariableReference">VariableReference</nt>) ergibt den
Wert, der an den Variablennamen innerhalb der Menge der
Variablenbelegungen des Kontexts gebunden ist. Es ist ein Fehler,
falls dem Variablennamen in der Menge der Variablenbelegungen aus dem 
Kontext des Ausdrucks kein Wert zugewiesen wurde.</p>

<transnote>
<p>
Der Name einer Variablen ist ein qualifizierter Name, kann also ein 
Präfix enthalten, das auf einen Namensraum verweist. Mittels des 
Zeichens <code>$</code> wird auf den Wert einer Variablen zugegriffen. 
</p><p>
Der letzte Satz des obigen Abschnitts bedeutet, dass Variablen vor
ihrer Benutzung definiert worden sein müssen.
Wie bereits erwähnt, sieht XPath dafür keinerlei Sprachelemente vor.
In <bibref ref="XSLT" /> verwendete Variablen haben immer einen 
definierten Wert. So wird durch das leere Element 
<code><![CDATA[<xsl:variable name="foo:var" />]]></code> eine Variable 
namens <code>foo:var</code> definiert und mit der leeren Zeichenkette
belegt.
</p>
</transnote>


<!-- ORIG
<p>Parentheses may be used for grouping.</p>
-->
<p>Zum Gruppieren können runde Klammern verwendet werden.</p>

<scrap>
<head></head>
<prod id="NT-Expr">
<lhs>Expr</lhs>
<rhs><nt def="NT-OrExpr">OrExpr</nt></rhs>
</prod>
<prod id="NT-PrimaryExpr">
<lhs>PrimaryExpr</lhs>
<rhs><nt def="NT-VariableReference">VariableReference</nt></rhs>
<rhs>| '(' <nt def="NT-Expr">Expr</nt> ')'</rhs>
<rhs>| <nt def="NT-Literal">Literal</nt></rhs>
<rhs>| <nt def="NT-Number">Number</nt></rhs>
<rhs>| <nt def="NT-FunctionCall">FunctionCall</nt></rhs>
</prod>
</scrap>

</div2>

<div2>
<!-- ORIG
<head>Function Calls</head>
-->
<head>Funktionsaufrufe</head>

<!-- ORIG
<p>A <nt def="NT-FunctionCall">FunctionCall</nt> expression is
evaluated by using the <nt def="NT-FunctionName">FunctionName</nt> to
identify a function in the expression evaluation context function
library, evaluating each of the <nt def="NT-Argument">Argument</nt>s,
converting each argument to the type required by the function, and
finally calling the function, passing it the converted arguments.  It
is an error if the number of arguments is wrong or if an argument
cannot be converted to the required type.  The result of the <nt
def="NT-FunctionCall">FunctionCall</nt> expression is the result
returned by the function.</p>
-->
<p>Ein Ausdruck, der ein Funktionsaufruf (<nt
def="NT-FunctionCall">FunctionCall</nt>) ist, wird ausgewertet, indem
anhand des Funktionsnamens (<nt def="NT-FunctionName">FunctionName</nt>)
die Funktion in der Funktionsbibliothek des Ausdruckskontexts bestimmt,
jedes der Argumente (<nt def="NT-Argument">Argument</nt>) 
berechnet und in den von der Funktion erwarteten Typ konvertiert
und schließlich die Funktion mit den konvertierten Argumenten 
aufgerufen wird. Es ist ein Fehler, wenn eine falsche Anzahl von
Argumenten übergeben wird oder eines der Argumente nicht in den 
geforderten Typ konvertiert werden kann. Das Ergebnis des 
Funktionsaufrufes (<nt def="NT-FunctionCall">FunctionCall</nt>) ist der
von der Funktion zurückgelieferte Wert.</p>

<!-- ORIG
<p>An argument is converted to type string as if by calling the
<function>string</function> function.  An argument is converted to
type number as if by calling the <function>number</function> function.
An argument is converted to type boolean as if by calling the
<function>boolean</function> function.  An argument that is not of
type node-set cannot be converted to a node-set.</p>
-->
<p>Die Konvertierung eines Arguments in den Typ <emph>string</emph>
geschieht so wie beim Aufruf der Funktion <function>string</function>.
Die Konvertierung eines Arguments in den Typ <emph>number</emph>
geschieht so wie beim Aufruf der Funktion <function>number</function>.
Die Konvertierung eines Arguments in den Typ <emph>boolean</emph>
geschieht so wie beim Aufruf der Funktion <function>boolean</function>.
Ein Argument, das nicht vom Typ <emph>node-set</emph> ist, kann nicht 
in eine Knotenmenge konvertiert werden.</p>

<transnote>
<p>
Dieser letzte Satz stimmt insofern, als es keine automatische 
Konvertierung in eine Knotenmenge gibt. Zusätzliche Funktionen können 
durchaus Werte anderer Typen als Parameter entgegennehmen und eine 
Knotenmenge zurückliefern. In vielen XSLT-1.0-konformen Prozessoren 
existiert beispielsweise eine Erweiterungsfunktion 
<code>node-set</code>, die für einen <emph>Ergebnisteilbaum</emph>
dessen äquivalente Knotenmenge zurückliefert.
</p>
</transnote>

<scrap>
<head></head>
<prod id="NT-FunctionCall">
<lhs>FunctionCall</lhs>
<rhs><nt def="NT-FunctionName">FunctionName</nt> '(' ( <nt def="NT-Argument">Argument</nt> ( ',' <nt def="NT-Argument">Argument</nt> )* )? ')'</rhs>
</prod>
<prod id="NT-Argument">
<lhs>Argument</lhs>
<rhs><nt def="NT-Expr">Expr</nt></rhs>
</prod>
</scrap>

</div2>

<div2 id="node-sets">
<head>Knotenmengen</head>

<!-- ORIG
<p>A location path can be used as an expression.  The expression
returns the set of nodes selected by the path.</p>
-->
<p>Ein Lokalisierungspfad kann als Ausdruck benutzt werden. Ein solcher
Ausdruck liefert die durch den Pfad ausgewählte Knotenmenge.</p>

<!-- ORIG
<p>The <code>|</code> operator computes the union of its operands,
which must be node-sets.</p>
-->
<p>Der Operator <code>|</code> berechnet die Vereinigung seiner
Operanden, welche jeweils Knotenmengen sein müssen.</p>

<transnote>
<p>
Da es sich um eine Vereinigung von Mengen handelt, ist ein
identischer Knoten in beiden Operanden in der Ergebnisknotenmenge 
auch nur einmal vorhanden. Zusammen mit der Funktion 
<function>count</function> (siehe <specref ref="node-set-functions" />)
lässt sich so die Identität zweier Knoten feststellen.
</p><p>
Die Knotenmenge <code>$a</code> ist in der Knotenmenge <code>$b</code>
enthalten, falls <code>count($b) = count($a | $b)</code>.
<code>$a</code> und <code>$b</code> sind identisch, wenn <code>$a</code>
in <code>$b</code> und <code>$b</code> in <code>$a</code> enthalten 
ist. Es handelt sich um einzelne Knoten, wenn außerdem 
<code>count($a) = 1</code> ist.
Achtung: Der Operator = bestimmt die Gleichheit der
<termref def="dt-string-value">Zeichenkettenwerte</termref> zweier 
Knoten (siehe <specref ref="booleans" />), nicht deren Identität.
</p><p>
XPath definiert keine Operatoren für die Bestimmung von Durchschnitt 
und Differenz zweier Knotenmengen. Basierend auf dem Teilmengentest 
lassen sich diese Operationen allerdings berechnen:
</p><p>
Durchschnitt von <code>$a</code> und <code>$b</code>:
</p>
<eg>$a[count(.|$b) = count($b)]</eg>
<p>
Differenz von <code>$a</code> und <code>$b</code>:
</p>
<eg>$a[count(.|$b) != count($b)]</eg>
<p>
Damit lässt sich nun auch testen, ob der Kontextknoten ein
Attributknoten ist (analog für Namensraumknoten):
</p>
<eg>count(.|../@*) = count(../@*)</eg>
<p>
Die bedingte Auswahl einer Knotenmenge aus zwei Alternativen abhängig 
von einem logischen Ausdruck kann durch folgende Konstruktion erreicht
werden:
</p>
<eg><emph>node-set1</emph>[<emph>boolean-test</emph>] | <emph>node-set2</emph>[not(<emph>boolean-test</emph>)]</eg>
<p>
In den Programmiersprachen C, C++ und Java stellt der 
Fragezeichenoperator <code>?:</code> diese Funktionalität bereit. Eine 
analoge Anwendung für Zeichenketten wird im Zusammenhang mit der 
Funktion <function>substring</function> in Kapitel 
<specref ref="string-functions" /> vorgestellt.
</p><p>
In XSLT-Mustern, die eine Teilmenge der XPath-Ausdrücke bilden, wird
der Operator <code>|</code> verwendet, um mögliche Alternativen 
anzugeben.
</p>
</transnote>

<!-- ORIG
<p><nt def="NT-Predicate">Predicate</nt>s are used to filter
expressions in the same way that they are used in location paths. It
is an error if the expression to be filtered does not evaluate to a
node-set.  The <nt def="NT-Predicate">Predicate</nt> filters the
node-set with respect to the child axis.</p>
-->
<p><nt def="NT-Predicate">Prädikate</nt> werden zum Filtern von 
Ausdrücken in der gleichen Weise wie in Lokalisierungspfaden benutzt. 
Es ist ein Fehler, falls das Ergebnis des zu filternden Ausdrucks keine
Knotenmenge ist. Das Prädikat filtert die Knotenmenge bezüglich der 
Kindachse.</p>

<!-- ORIG
<note><p>The meaning of a <nt def="NT-Predicate">Predicate</nt>
depends crucially on which axis applies. For example,
<code>preceding::foo[1]</code> returns the first <code>foo</code>
element in <emph>reverse document order</emph>, because the axis that
applies to the <code>[1]</code> predicate is the preceding axis; by
contrast, <code>(preceding::foo)[1]</code> returns the first
<code>foo</code> element in <emph>document order</emph>, because the
axis that applies to the <code>[1]</code> predicate is the child
axis.</p></note>
-->
<note><p>Die Bedeutung eines <nt 
def="NT-Predicate">Prädikat</nt>s hängt entscheidend davon ab,
welche Achse angewendet wird. Zum Beispiel liefert
<code>preceding::foo[1]</code> das erste <code>foo</code>-Element
in <emph>umgekehrter Dokumentordnung</emph>, weil die für das Prädikat
<code>[1]</code> anzuwendende Achse die Vorgängerachse (preceding)
ist. Demgegenüber liefert <code>(preceding::foo)[1]</code> das erste
<code>foo</code>-Element in <emph>Dokumentordnung</emph>, weil die
Achse, die in diesem Fall für das Prädikat <code>[1]</code> gilt, die 
Kindachse ist.</p></note>

<transnote>
<p>
Auf diesen Unterschied soll noch einmal deutlich hingewiesen werden:
Prädikate, die Bestandteil eines Lokalisierungsschrittes sind, filtern 
eine Knotenmenge bezüglich der im Lokalisierungsschritt verwendeten 
Achse. Für jeden Knoten der Knotenmenge ist daher dessen <termref 
def="dt-proximity-position">Näheposition</termref> relevant.
Prädikate, die auf einen XPath-Ausdruck angewendet werden, 
interpretieren die betreffenden Knoten immer in 
<termref def="dt-document-order">Dokumentordnung</termref>,
da laut Definition in solch einem Fall die Kindachse anzuwenden ist.
</p><p>
Im obigen Beispiel <code>preceding::foo[1]</code> ist das Prädikat 
<code>[1]</code> Bestandteil des Lokalisierungsschrittes
<code>preceding::foo[1]</code>, während bei
<code>(preceding::foo)[1]</code> das Prädikat <code>[1]</code>
auf den Ausdruck <code>(preceding::foo)</code> angewendet wird 
(welcher in diesem Fall ein Lokalisierungsschritt ohne Prädikat ist).
</p><p>
Das folgende Beispiel stellt den Sachverhalt aus einer praxisnäheren 
Sicht dar. Es gibt zwar die Achse <code>ancestor-or-self</code>, 
welche neben allen Vorfahren auch den Kontextknoten auswählt, es gibt 
aber keine entsprechende Achse <code>preceding-or-self</code>, die alle
Vorgänger inklusive des Kontextknotens auswählen könnte. Die 
gewünschte Knotenmenge muss also durch eine Vereinigung konstruiert
werden: <code>preceding::node() | self::node()</code>. Bei der
Anwendung eines oder mehrerer Prädikate auf die entstehende Menge, 
etwa <code>(preceding::node() | .)[@id][1]</code>, muss man beachten, 
dass die Knoten nun in 
<termref def="dt-document-order">Dokumentordnung</termref>
gefiltert werden. Der Ausdruck liefert damit den ersten Knoten im
Dokument, der ein Vorgänger des Kontextknotens ist und ein Attribut
<code>id</code> besitzt, und nicht den zum Kontextknoten nächsten
Knoten mit dieser Eigenschaft.
</p><p>
Bei der Betrachtung des Beispiels
<code>(preceding-sibling::* | following-sibling::*)[1]</code> wird 
klar, dass für solche Ausdrücke eine von den beteiligten Achsen 
abhängende Knotenordnung nicht praktikabel ist.
</p><p>
An dieser Stelle sei darauf hingewiesen, dass über die in
<bibref ref="XSLT" /> definierte Funktion
<xfunction href="&XSLTSPEC;">document</xfunction>
<!-- ohne xfunction-Element:
<loc href="&XSLTSPEC;#function-document">document</loc>
-->
auch Knotenmengen aus verschiedenen Dokumenten miteinander vereinigt 
werden können. In diesem Fall gibt es keine definierte Dokumentordnung 
für die Vereinigungsmenge mehr. Die Anwendung eines entsprechenden 
Prädikats ist damit implementationsabhängig. Entsprechendes gilt bei 
einer Knotenmenge, die die Attribute eines Elements enthält.
</p>
</transnote>

<!-- ORIG
<p>The <code>/</code> and <code>//</code> operators compose an
expression and a relative location path.  It is an error if the
expression does not evaluate to a node-set.  The <code>/</code>
operator does composition in the same way as when <code>/</code> is
used in a location path. As in location paths, <code>//</code> is
short for <code>/descendant-or-self::node()/</code>.</p>
-->
<p>Die Operatoren <code>/</code> und <code>//</code> verbinden einen
Ausdruck und einen relativen Lokalisierungspfad. Es ist ein Fehler,
wenn die Berechnung des Ausdrucks keine Knotenmenge ergibt. Der
Operator <code>/</code> arbeitet dabei in der gleichen Weise wie in 
einem Lokalisierungspfad. Ebenso wie in Lokalisierungspfaden steht
<code>//</code> abkürzend für 
<code>/descendant-or-self::node()/</code>.</p>

<!-- ORIG
<p>There are no types of objects that can be converted to node-sets.</p>
-->

<p>Es gibt keine Objekte, die in eine Knotenmenge konvertiert werden
können.</p>

<transnote>
<p>
Angenommen, eine Variable namens <code>divs</code> enthält eine
Knotenmenge von diversen <code>div</code>-Elementen (<code>div1</code>,
<code>div2</code>, etc). Dann kann mittels <code>$divs[1]</code> auf 
das erste dieser Elemente zugegriffen werden.
<code>$divs/@id</code> liefert die Menge der 
<code>id</code>-Attributknoten der Elemente aus <code>$divs</code>,
<code>$divs//image</code> liefert die Menge aller 
<code>image</code>-Elemente, die Nachkommen eines in <code>$divs</code>
enthaltenen <code>div</code>-Elements sind.
</p><p>
Dabei ist zu beachten, dass sich einem Ausdruck anschließende
Lokalisierungsschritte immer auf die Position der Knoten im
XML-Dokument beziehen und nicht auf die durch den Ausdruck
berechnete Knotenmenge. Beispielsweise bestimmt 
<code>$divs[1]/following-sibling::*</code> den nachfolgenden
Geschwisterknoten des ersten Knotens aus <code>$divs</code> im
XML-Dokument, und <emph>nicht</emph> den <quote>Nachfolger</quote> in 
<code>$divs</code>, also <code>$divs[2]</code>. Allgemein gesprochen
gibt es keinen Weg, der es erlaubt, ausgehend von einem Kontextknoten, 
der Element einer zuvor bestimmten Knotenmenge ist, auf die anderen 
Knoten dieser Menge zuzugreifen. Das betrifft insbesondere Ausdrücke,
die in Prädikaten oder im Körper der XSLT-Anweisung 
<code>xsl:for-each</code> auftreten.
</p><p>
Ausdrücke, speziell Variablen, dürfen nur vor <code>/</code> und
<code>//</code> auftreten. Es ist nicht möglich, Ausdrücke dynamisch
zusammenzusetzen, wie man es etwa mit <code>/root/$element</code>
versuchen könnte. Eine Möglichkeit, innerhalb eines Pfades dynamisch 
ein bestimmtes Element auszuwählen, wird im Zusammenhang mit der 
Funktion <function>name</function> vorgestellt.
</p><p>
Wie schon gesagt wurde, muss ein Ausdruck, dem ein Prädikat oder einer 
der Operatoren <code>/</code> und <code>//</code> folgt, immer eine 
Knotenmenge als Ergebnis liefern. Da Objekte anderer Typen nicht in
eine Knotenmenge konvertiert werden können, führt die Auswertung eines 
Ausdrucks, der keine Knotenmenge ergibt, in diesem Fall zu einem 
Fehler. XPath nutzende Spezifikationen und Implementationen können 
jedoch explizit zusätzliche Funktionen definieren, die beliebige 
Objekte in Knotenmengen überführen.
</p>
</transnote>

<scrap>
<head></head>
<prod id="NT-UnionExpr">
<lhs>UnionExpr</lhs>
<rhs><nt def="NT-PathExpr">PathExpr</nt></rhs>
<rhs>| <nt def="NT-UnionExpr">UnionExpr</nt> '|' <nt def="NT-PathExpr">PathExpr</nt></rhs>
</prod>
<prod id="NT-PathExpr">
<lhs>PathExpr</lhs>
<rhs><nt def="NT-LocationPath">LocationPath</nt></rhs>
<rhs>| <nt def="NT-FilterExpr">FilterExpr</nt></rhs>
<rhs>| <nt def="NT-FilterExpr">FilterExpr</nt> '/' <nt def="NT-RelativeLocationPath">RelativeLocationPath</nt></rhs>
<rhs>| <nt def="NT-FilterExpr">FilterExpr</nt> '//' <nt def="NT-RelativeLocationPath">RelativeLocationPath</nt></rhs>
</prod>
<prod id="NT-FilterExpr">
<lhs>FilterExpr</lhs>
<rhs><nt def="NT-PrimaryExpr">PrimaryExpr</nt></rhs>
<rhs>| <nt def="NT-FilterExpr">FilterExpr</nt> <nt def="NT-Predicate">Predicate</nt></rhs>
</prod>
</scrap>

</div2>

<div2 id="booleans">
<!-- ORIG
<head>Booleans</head>
-->
<head>Boolesche Werte</head>

<!-- ORIG
<p>An object of type boolean can have one of two values, true and
false.</p>
-->

<p>Ein Objekt vom Typ <emph>boolean</emph> kann zwei Werte annehmen, 
<emph>wahr</emph> und <emph>falsch</emph>.</p>

<!-- ORIG
<p>An <code>or</code> expression is evaluated by evaluating each
operand and converting its value to a boolean as if by a call to the
<function>boolean</function> function.  The result is true if either
value is true and false otherwise.  The right operand is not evaluated
if the left operand evaluates to true.</p>
-->
<p>Die Berechnung eines <code>or</code>-Ausdrucks erfolgt, indem jeder 
der Operanden berechnet und in einen booleschen Wert wie beim Aufruf
der Funktion <function>boolean</function> konvertiert wird. Das 
Ergebnis ist der Wert <emph>wahr</emph>, wenn einer der beiden Werte 
<emph>wahr</emph> ist, und andernfalls <emph>falsch</emph>. Der rechte
Operand wird nicht mehr ausgewertet, wenn der linke Operand 
<emph>wahr</emph> ergibt.</p>

<!-- ORIG
<p>An <code>and</code> expression is evaluated by evaluating each
operand and converting its value to a boolean as if by a call to the
<function>boolean</function> function.  The result is true if both
values are true and false otherwise.  The right operand is not
evaluated if the left operand evaluates to false.</p>
-->
<p>Die Berechnung eines <code>and</code>-Ausdrucks erfolgt, indem jeder
der Operanden berechnet und in einen booleschen Wert wie beim Aufruf
der Funktion <function>boolean</function> konvertiert wird. Das 
Ergebnis ist der Wert <emph>wahr</emph>, wenn beide Werte 
<emph>wahr</emph> sind, und andernfalls <emph>falsch</emph>. Der rechte
Operand wird nicht mehr ausgewertet, wenn der linke Operand 
<emph>falsch</emph> ergibt.</p>

<transnote>
<p>
Mit dieser Regelung lässt sich die Berechnung von Teilausdrücken und 
der Aufruf enthaltener Funktionen verhindern. Abgesehen von 
Performance-Aspekten hat sie im Zusammenhang mit XSLT allerdings nicht 
die gleiche Bedeutung wie in anderen Programmiersprachen.
</p><p>
So arbeiten alle XSLT-Funktionen ohne Seiteneffekte (sie produzieren 
weder Ausgaben noch ändern sie Variableninhalte); Funktionsparameter 
werden automatisch in den geforderten Typ konvertiert und
mathematische Operationen liefern immer einen definierten Wert. 
Lediglich Typfehler können auftreten, falls ein Ausdruck als Operand 
oder Funktionsparameter eine Knotenmenge verlangt. Allerdings gibt es 
in XPath keine Möglichkeit festzustellen, ob ein Teilausdruck vom Typ 
Knotenmenge ist.
</p><p>
Da sich über Erweiterungsmechanismen jedoch Funktionen definieren 
lassen, die die genannten Eigenschaften nicht mehr besitzen, 
kann über eine Verknüpfung mit <code>or</code> oder <code>and</code> 
der Aufruf solcher Funktionen bei Bedarf verhindert werden.
</p>
</transnote>

<!-- ORIG
<p>An <nt def="NT-EqualityExpr">EqualityExpr</nt> (that is not just
a <nt def="NT-RelationalExpr">RelationalExpr</nt>) or a <nt
def="NT-RelationalExpr">RelationalExpr</nt> (that is not just an <nt
def="NT-AdditiveExpr">AdditiveExpr</nt>) is evaluated by comparing the
objects that result from evaluating the two operands.  Comparison of
the resulting objects is defined in the following three paragraphs.
First, comparisons that involve node-sets are defined in terms of
comparisons that do not involve node-sets; this is defined uniformly
for <code>=</code>, <code>!=</code>, <code>&lt;=</code>,
<code>&lt;</code>, <code>&gt;=</code> and <code>&gt;</code>.  Second,
comparisons that do not involve node-sets are defined for
<code>=</code> and <code>!=</code>.  Third, comparisons that do not
involve node-sets are defined for <code>&lt;=</code>,
<code>&lt;</code>, <code>&gt;=</code> and <code>&gt;</code>.</p>
-->
<p>Die Berechnung eines <nt
def="NT-EqualityExpr">EqualityExpr</nt>-Ausdrucks (der nicht
allein ein <nt def="NT-RelationalExpr">RelationalExpr</nt>-Ausdruck ist)
oder eines <nt def="NT-RelationalExpr">RelationalExpr</nt>-Ausdrucks
(der nicht allein ein <nt 
def="NT-AdditiveExpr">AdditiveExpr</nt>-Ausdruck ist) geschieht, indem
die Objekte miteinander verglichen werden, die im Ergebnis der 
Auswertung der beiden Operanden entstehen. 
Die folgenden drei Absätze definieren den Vergleich zwischen den
daraus resultierenden Objekten.
Erst werden Vergleiche, die Knotenmengen betreffen, über Vergleiche 
definiert, die keine Knotenmengen betreffen; dies geschieht einheitlich 
für <code>=</code>, <code>!=</code>, <code>&lt;=</code>,
<code>&lt;</code>, <code>&gt;=</code> und <code>&gt;</code>.
Dann werden Vergleiche, die keine Knotenmengen betreffen, für 
<code>=</code> und <code>!=</code> definiert. 
Schließlich werden Vergleiche, die keine Knotenmengen betreffen, für 
<code>&lt;=</code>, <code>&lt;</code>, <code>&gt;=</code> und 
<code>&gt;</code> definiert.</p>

<!-- ORIG
<p>If both objects to be compared are node-sets, then the comparison
will be true if and only if there is a node in the first node-set and
a node in the second node-set such that the result of performing the
comparison on the <termref
def="dt-string-value">string-value</termref>s of the two nodes is
true.  If one object to be compared is a node-set and the other is a
number, then the comparison will be true if and only if there is a
node in the node-set such that the result of performing the comparison
on the number to be compared and on the result of converting the
<termref def="dt-string-value">string-value</termref> of that node to
a number using the <function>number</function> function is true.  If
one object to be compared is a node-set and the other is a string,
then the comparison will be true if and only if there is a node in the
node-set such that the result of performing the comparison on the
<termref def="dt-string-value">string-value</termref> of the node and
the other string is true. If one object to be compared is a node-set
and the other is a boolean, then the comparison will be true if and
only if the result of performing the comparison on the boolean and on
the result of converting the node-set to a boolean using the
<function>boolean</function> function is true.</p>
-->
<p>Wenn beide zu vergleichenden Objekte Knotenmengen sind, so liefert
ein Vergleich genau dann den Wert <emph>wahr</emph>, wenn es einen 
Knoten aus der ersten Knotenmenge und einen Knoten aus der zweiten 
Knotenmenge gibt, sodass das Ergebnis des Vergleichs der 
<termref def="dt-string-value">Zeichenkettenwerte</termref> dieser
beiden Knoten <emph>wahr</emph> ergibt. 
Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das 
andere eine Zahl ist, dann liefert ein Vergleich genau dann den Wert 
<emph>wahr</emph>, wenn es einen Knoten in der Knotenmenge gibt, sodass
der Vergleich zwischen der Zahl und dem Ergebnis der Konvertierung des 
<termref def="dt-string-value">Zeichenkettenwerts</termref> dieses
Knotens zu einer Zahl über die Funktion <function>number</function>
<emph>wahr</emph> ergibt.
Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das 
andere eine Zeichenkette ist, dann liefert ein Vergleich genau dann den
Wert <emph>wahr</emph>, wenn es einen Knoten in der Knotenmenge gibt, 
sodass der Vergleich zwischen der Zeichenkette und dem 
<termref def="dt-string-value">Zeichenkettenwert</termref> dieses
Knotens <emph>wahr</emph> ergibt.
Wenn eines der zu vergleichenden Objekte eine Knotenmenge und das 
andere ein boolescher Wert ist, dann liefert ein Vergleich genau dann 
den Wert <emph>wahr</emph>, wenn es einen Knoten in der Knotenmenge 
gibt, sodass der Vergleich zwischen dem booleschen Wert und dem 
Ergebnis der Konvertierung des 
<termref def="dt-string-value">Zeichenkettenwerts</termref> dieses
Knotens zu einem boolschen Wert über die Funktion
<function>boolean</function> <emph>wahr</emph> ergibt.</p>

<!-- ORIG
<p>When neither object to be compared is a node-set and the operator
is <code>=</code> or <code>!=</code>, then the objects are compared by
converting them to a common type as follows and then comparing them.
If at least one object to be compared is a boolean, then each object
to be compared is converted to a boolean as if by applying the
<function>boolean</function> function.  Otherwise, if at least one
object to be compared is a number, then each object to be compared is
converted to a number as if by applying the
<function>number</function> function.  Otherwise, both objects to be
compared are converted to strings as if by applying the
<function>string</function> function.  The <code>=</code> comparison
will be true if and only if the objects are equal; the <code>!=</code>
comparison will be true if and only if the objects are not equal.
Numbers are compared for equality according to IEEE 754 <bibref
ref="IEEE754"/>.  Two booleans are equal if either both are true or
both are false.  Two strings are equal if and only if they consist of
the same sequence of UCS characters.</p>
-->
<p>Wenn keines der zu vergleichenden Objekte eine Knotenmenge ist und 
als Operator <code>=</code> oder <code>!=</code> vorkommt, so werden 
die Objekte wie nachfolgend beschrieben in einen gemeinsamen Typ 
konvertiert und anschließend verglichen.
Wenn wenigstens eines der zu vergleichenden Objekte ein boolescher
Wert ist, wird jedes Objekt wie bei der Anwendung der Funktion
<function>boolean</function> in einen booleschen Wert konvertiert.
Wenn wenigstens eines der zu vergleichenden Objekte eine
Zahl ist, wird jedes Objekt wie bei der Anwendung der Funktion 
<function>number</function> in eine Zahl konvertiert.
Andernfalls werden beide Objekte wie bei der Anwendung der Funktion 
<function>string</function> in Zeichenketten konvertiert.
Der Vergleich <code>=</code> liefert als Ergebnis genau dann den Wert
<emph>wahr</emph>, wenn beide Objekte gleich sind; 
der Vergleich <code>!=</code> liefert als Ergebnis genau dann den Wert
<emph>wahr</emph>, wenn beide Objekte ungleich sind. 
Zahlen werden gemäß IEEE 754 <bibref ref="IEEE754"/> verglichen.
Zwei boolesche Werte sind gleich, wenn sie entweder beide 
<emph>wahr</emph> oder beide <emph>falsch</emph> sind. Zwei 
Zeichenketten sind genau dann gleich, wenn sie aus derselben Folge von 
UCS-Zeichen bestehen.</p>

<!-- ORIG
<note><p>If <code>$x</code> is bound to a node-set, then
<code>$x="foo"</code> does not mean the same as
<code>not($x!="foo")</code>: the former is true if and only if
<emph>some</emph> node in <code>$x</code> has the string-value
<code>foo</code>; the latter is true if and only if <emph>all</emph>
nodes in <code>$x</code> have the string-value
<code>foo</code>.</p></note>
-->
<note><p>Wenn <code>$x</code> mit einer Knotenmenge belegt ist, dann
bedeutet <code>$x="foo"</code> nicht dasselbe wie
<code>not($x!="foo")</code>: Der erste Vergleich ergibt genau dann 
<emph>wahr</emph>, wenn <emph>ein</emph> Knoten in <code>$x</code> den 
Zeichenkettenwert <code>foo</code> hat; der zweite ergibt genau dann 
<emph>wahr</emph>, wenn <emph>alle</emph> Knoten in <code>$x</code> den
Zeichenkettenwert <code>foo</code> haben.</p></note>

<transnote>
<p>
Der Vergleich <code>$x!="foo"</code> ist genau dann <emph>wahr</emph>, 
wenn es wenigstens einen Knoten aus <code>$x</code> gibt, für den die 
Ungleichheit gilt, d.h. <emph>falsch</emph>, wenn es keinen solchen 
Knoten gibt. Damit ist <code>not($x!="foo")</code> <emph>wahr</emph>, 
wenn es keinen Knoten aus <code>$x</code> gibt, dessen 
Zeichenkettenwert verschieden von <code>foo</code> ist, d.h. wenn alle 
Knoten den Zeichenkettenwert <code>foo</code> besitzen.
</p><p>
Ein häufigerer Fall dürfte der Test auf Ungleichheit sein. Man möchte 
z.B. feststellen, ob der Wert eines Ausdrucks verschieden von 
allen Kindelementen <code>entry</code> ist. Die Lösung lautet in diesem
Fall nicht <code>entry!="foo"</code> (hier wird auf alle 
<code>entry</code>-Kindelemente zugegriffen und getestet, ob unter 
diesen eines existiert, das verschieden von der Zeichenkette 
<code>"foo"</code> ist), sondern <code>not(entry="foo")</code>.
</p><p>
Bemerkenswert ist noch der Fall, dass die beteiligte Knotenmenge leer 
ist. Ein Vergleich <code>@type!="warning"</code> ist 
<emph>falsch</emph>, wenn kein Attribut <code>type</code> existiert. 
Dagegen liefert <code>not(@type="warning")</code> in diesem Fall den 
Wert <emph>wahr</emph>.
</p><p>
Es sei noch einmal darauf hingewiesen, dass für Knotenmengen mit den 
Operatoren <code>=</code> und <code>!=</code> nicht die Identität von 
Knoten getestet wird, sondern die ihrer 
<termref def="dt-string-value">Zeichenkettenwerte</termref>. Zwei
Knoten können unter Zuhilfenahme des Operators <code>|</code> auf
Identität getestet werden, siehe Anmerkung in Kapitel
<specref ref="node-sets" />.
</p>
</transnote>

<!-- ORIG
<p>When neither object to be compared is a node-set and the operator
is <code>&lt;=</code>, <code>&lt;</code>, <code>&gt;=</code> or
<code>&gt;</code>, then the objects are compared by converting both
objects to numbers and comparing the numbers according to IEEE 754.
The <code>&lt;</code> comparison will be true if and only if the first
number is less than the second number.  The <code>&lt;=</code>
comparison will be true if and only if the first number is less than
or equal to the second number.  The <code>&gt;</code> comparison will
be true if and only if the first number is greater than the second
number.  The <code>&gt;=</code> comparison will be true if and only if
the first number is greater than or equal to the second number.</p>
-->
<p>Wenn keines der zu vergleichenden Objekte eine Knotenmenge ist und 
als Operator <code>&lt;=</code>, <code>&lt;</code>, <code>&gt;=</code> 
oder <code>&gt;</code> vorkommt, so werden beide Objekte in Zahlen 
konvertiert und anschließend gemäß IEEE 754 verglichen. 
Der Vergleich <code>&lt;</code> ergibt genau dann den Wert 
<emph>wahr</emph>, wenn die erste Zahl kleiner als die zweite Zahl ist. 
Der Vergleich <code>&lt;=</code> ergibt genau dann den Wert 
<emph>wahr</emph>, wenn die erste Zahl kleiner oder gleich der zweiten 
Zahl ist. 
Der Vergleich <code>&gt;</code> ergibt genau dann den Wert 
<emph>wahr</emph>, wenn die erste Zahl größer als die zweite Zahl ist. 
Der Vergleich <code>&gt;=</code> ergibt genau dann den Wert 
<emph>wahr</emph>, wenn die erste Zahl größer oder gleich der zweiten 
Zahl ist.</p>

<transnote>
<p>
Somit sind Vergleiche, an denen Knotenmengen beteiligt sind, dann 
erfüllt, wenn sich wenigstens ein Knoten aus der jeweiligen Menge 
finden lässt, dessen 
<termref def="dt-string-value">Zeichenkettenwert</termref>
den Vergleich erfüllt. Insbesondere liefert der Vergleich mit 
wenigstens einer leeren Menge in jedem Fall den Wert 
<emph>falsch</emph>. Sind nur Werte verschiedener skalarer Typen 
beteiligt, so wird in der Rangfolge "boolescher Wert &ndash; Zahl 
&ndash; Zeichenkette" ein gemeinsamer Typ gesucht und der jeweils 
andere Wert konvertiert. Größenvergleiche sind nur für Zahlen definiert.
</p><p>
Unter Ausnutzung dieser Regeln kann z.B. die kleinste Zahl in
einer Knotenmenge <code>$set</code> folgendermaßen bestimmt werden:
</p>
<eg>$set[not(. &gt; $set)]</eg>
<p>
Ein Vergleich mit dem speziellen Zahlenwert NaN (Not a Number) liefert
immer den Wert <emph>falsch</emph>, selbst bei 
<code>number('NaN')=number('NaN')</code>.
Bei <code>'NaN'</code> handelt es sich hier nicht um eine spezielle 
Zeichenkette, die in den Wert NaN konvertiert wird, sondern einfach um
eine, die sich nicht konvertieren lässt. Können in der Beispielmenge
<code>$set</code> auch Knoten auftreten, deren 
<termref def="dt-string-value">Zeichenkettenwert</termref> sich nicht
in eine Zahl konvertieren lässt, könnte man den obigen Ausdruck auf 
folgende, etwas unkonventionelle Weise vervollständigen:
</p>
<eg>$set[number()=number() and not(. &gt; $set)]</eg>
<p>
Vorsicht ist geboten, wenn die Werte einer Knotenmenge vor dem 
Vergleich durch eine Funktion mit skalarem Argumenttyp bearbeitet 
werden sollen. Übergibt man der Funktion die gesamte Knotenmenge als 
Argument, wird nur mit dem Funktionswert des ersten Knotens verglichen.
Die spezielle Semantik des Vergleichs mit Knotenmengen geht verloren.
In der Anmerkung zur Funktion <function>normalize-space</function> wird
dies an einem Beispiel ausführlicher erläutert.
</p><p>
XPath stellt keine Möglichkeit zur Verfügung, mit der man Zeichenketten
lexikographisch der Größe nach vergleichen könnte. Abhängig vom 
Anwendungsfall lassen sich in XSLT solche Vergleiche durch die 
Programmierung rekursiver Templates oder die Benutzung des 
<code>xsl:sort</code>-Elements realisieren.
</p>
</transnote>

<note>

<!-- ORIG
<p>When an XPath expression occurs in an XML document, any
<code>&lt;</code> and <code>&lt;=</code> operators must be quoted
according to XML 1.0 rules by using, for example,
<code>&amp;lt;</code> and <code>&amp;lt;=</code>. In the following
example the value of the <code>test</code> attribute is an XPath
expression:</p>
-->
<p>Wenn ein XPath-Ausdruck in einem XML-Dokument vorkommt, müssen
alle Operatoren <code>&lt;</code> und <code>&lt;=</code> gemäß den
XML-1.0-Regeln geschützt werden, zum Beispiel als
<code>&amp;lt;</code> und <code>&amp;lt;=</code>. Im folgenden
Beispiel ist der Wert des Attributes <code>test</code> ein
XPath-Ausdruck:</p>

<eg><![CDATA[<xsl:if test="@value &lt; 10">...</xsl:if>]]></eg>

</note>

<scrap>
<head></head>
<prod id="NT-OrExpr">
<lhs>OrExpr</lhs>
<rhs><nt def="NT-AndExpr">AndExpr</nt></rhs>
<rhs>| <nt def="NT-OrExpr">OrExpr</nt> 'or' <nt def="NT-AndExpr">AndExpr</nt></rhs>
</prod>
<prod id="NT-AndExpr">
<lhs>AndExpr</lhs>
<rhs><nt def="NT-EqualityExpr">EqualityExpr</nt></rhs>
<rhs>| <nt def="NT-AndExpr">AndExpr</nt> 'and' <nt def="NT-EqualityExpr">EqualityExpr</nt></rhs>
</prod>
<prod id="NT-EqualityExpr">
<lhs>EqualityExpr</lhs>
<rhs><nt def="NT-RelationalExpr">RelationalExpr</nt></rhs>
<rhs>| <nt def="NT-EqualityExpr">EqualityExpr</nt> '=' <nt def="NT-RelationalExpr">RelationalExpr</nt></rhs>
<rhs>| <nt def="NT-EqualityExpr">EqualityExpr</nt> '!=' <nt def="NT-RelationalExpr">RelationalExpr</nt></rhs>
</prod>
<prod id="NT-RelationalExpr">
<lhs>RelationalExpr</lhs>
<rhs><nt def="NT-AdditiveExpr">AdditiveExpr</nt></rhs>
<rhs>| <nt def="NT-RelationalExpr">RelationalExpr</nt> '&lt;' <nt def="NT-AdditiveExpr">AdditiveExpr</nt></rhs>
<rhs>| <nt def="NT-RelationalExpr">RelationalExpr</nt> '>' <nt def="NT-AdditiveExpr">AdditiveExpr</nt></rhs>
<rhs>| <nt def="NT-RelationalExpr">RelationalExpr</nt> '&lt;=' <nt def="NT-AdditiveExpr">AdditiveExpr</nt></rhs>
<rhs>| <nt def="NT-RelationalExpr">RelationalExpr</nt> '>=' <nt def="NT-AdditiveExpr">AdditiveExpr</nt></rhs>
</prod>
</scrap>

<note>
<!-- ORIG
<p>The effect of the above grammar is that the order of
precedence is (lowest precedence first):</p>
-->
<p>Mit der obigen Grammatik ergibt sich folgende Vorrangfolge
(kleinster Vorrang zuerst):</p>

<ulist>

<item><p><code>or</code></p></item>

<item><p><code>and</code></p></item>

<item><p><code>=</code>, <code>!=</code></p></item>

<item><p><code>&lt;=</code>, <code>&lt;</code>, <code>&gt;=</code>,
<code>&gt;</code></p></item>

</ulist>

<!-- ORIG
<p>and the operators are all left associative.</p>
-->
<p>Alle Operatoren sind links-assoziativ.</p>

<!-- ORIG
<p>For example, <code>3 &gt; 2 &gt; 1</code> is equivalent to <code>(3
&gt; 2) &gt; 1</code>, which evaluates to false.</p>
-->
<p>Beispielsweise ist <code>3 &gt; 2 &gt; 1</code> äquivalent zu
<code>(3 &gt; 2) &gt; 1</code>, was den Wert <emph>falsch</emph> 
ergibt.</p>
<transnote>
<p>
Der Vergleich <code>3 &gt; 2</code> ergibt zunächst den Wert 
<emph>wahr</emph>. Dieses Ergebnis wird aufgrund des folgenden 
Vergleichsoperators <code>&gt;</code> in die Zahl 1 konvertiert, sodass
nun <code>1 &gt; 1</code> berechnet wird, was den Wert 
<emph>falsch</emph> liefert.
Auf analoge Weise kann man sich überlegen, dass der Ausdruck
<code>2 = 1 = 0</code> <emph>wahr</emph>, der Ausdruck
<code>0 = 0 = 0</code> hingegen <emph>falsch</emph> ergibt.
</p><p>
Hier ist Vorsicht geboten, da solche Ausdrücke gemäß der 
XPath-Grammatik erlaubt sind, aber nicht die Semantik besitzen, die man
auf den ersten Blick erwarten würde. Sie verhalten sich allerdings 
genauso wie beispielsweise in den Programmiersprachen C und C++.
</p>
</transnote>
</note>

</div2>

<div2 id="numbers">
<!-- ORIG
<head>Numbers</head>
-->
<head>Zahlen</head>

<!-- ORIG
<p>A number represents a floating-point number.  A number can have any
double-precision 64-bit format IEEE 754 value <bibref ref="IEEE754"/>.
These include a special <quote>Not-a-Number</quote> (NaN) value,
positive and negative infinity, and positive and negative zero.  See
<loc href="http://java.sun.com/docs/books/jls/html/4.doc.html#9208"
>Section 4.2.3</loc> of <bibref ref="JLS"/> for a summary of the key
rules of the IEEE 754 standard.</p>
-->
<p>Ein Wert vom Typ <emph>number</emph> repräsentiert eine 
Gleitkommazahl. Eine Zahl kann jeden beliebigen, doppelt-genauen 
64-Bit-Wert des Formats IEEE 754 <bibref ref="IEEE754" /> annehmen. 
Dies beinhaltet den speziellen Wert <quote>Not-a-Number</quote> (NaN), 
positiv und negativ unendlich, sowie positiv und negativ Null. Für eine
Zusammenfassung der wichtigsten Regeln des IEEE-754-Standards siehe
<loc href="http://java.sun.com/docs/books/jls/html/4.doc.html#9208"
>Abschnitt 4.2.3</loc> in <bibref ref="JLS"/>.</p>

<transnote>
<p>
Die genannten speziellen Werte entstehen dann, wenn eine 
Rechenoperation einen Überlauf produzieren würde bzw. das Ergebnis 
nicht definiert ist. Beim Rechnen mit Zahlen in XPath können keine 
Fehler oder Ausnahmen auftreten.
</p><p>
An dieser Stelle sei bereits kurz auf die Produktion für
<nt def="NT-Number">Number</nt> in <specref ref="exprlex" />
hingewiesen. Zahlen in XPath sind Gleitkommazahlen ohne 
Exponentendarstellung. Eine Schreibweise 2.99792E+08 ist nicht 
zulässig. Sie können ein negatives, aber kein explizites positives 
Vorzeichen besitzen. Soll einer der speziellen Werte wie z.B. positiv 
unendlich verwendet werden, muss dieser ermittelt werden, etwa durch 
<code>1 div 0</code>.
</p><p>
Es gibt in XPath weder einen speziellen Typ für ganzzahlige Werte noch
gesonderte Zahlendarstellungen, die eine Zahl als Oktal- oder
Hexadezimalzahl interpretieren, wie dies in vielen Programmiersprachen
möglich ist.
</p>
</transnote>


<!-- ORIG
<p>The numeric operators convert their operands to numbers as if by
calling the <function>number</function> function.</p>
-->
<p>Die numerischen Operatoren konvertieren ihre Operanden in Zahlen, so
wie bei einem Aufruf der Funktion <function>number</function>.</p>

<!-- ORIG
<p>The <code>+</code> operator performs addition.</p>
-->
<p>Der Operator <code>+</code> addiert.</p>

<!-- ORIG
<p>The <code>-</code> operator performs subtraction.</p>
-->
<p>Der Operator <code>-</code> subtrahiert.</p>

<!-- Errata ORIG
The binary - operator performs subtraction. The unary - operator 
performs negation. Note that -0 evaluates to negative zero.
-->

<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> ist die Semantik des
einstelligen Operators <code>-</code> nicht spezifiziert. Stattdessen 
muss dieser letzte Absatz lauten:
</p><p>
<phrase role="errata" diff="chg">Der zweistellige Operator 
<code>-</code> subtrahiert. Der einstellige Operator <code>-</code> 
berechnet die Negation. Beachten Sie, dass <code>-0</code> negativ Null 
ergibt.</phrase>
</p>
</transnote>

<!-- ORIG
<note><p>Since XML allows <code>-</code> in names, the <code>-</code>
operator typically needs to be preceded by whitespace.  For example,
<code>foo-bar</code> evaluates to a node-set containing the child
elements named <code>foo-bar</code>; <code>foo - bar</code> evaluates
to the difference of the result of converting the <termref
def="dt-string-value">string-value</termref> of the first
<code>foo</code> child element to a number and the result of
converting the <termref def="dt-string-value">string-value</termref>
of the first <code>bar</code> child to a number.</p></note>
-->
<note><p>Da XML innerhalb von Namen das Zeichen <code>-</code> erlaubt, 
muss der Operator <code>-</code> typischerweise von einem 
Leerraumzeichen angeführt werden. Zum Beispiel ergibt 
<code>foo-bar</code> eine Knotenmenge, die die Kindelemente namens 
<code>foo-bar</code> enthält;
<code>foo - bar</code> ergibt die Differenz aus den Werten, die durch
Konvertierung des <termref 
def="dt-string-value">Zeichenkettenwertes</termref> des ersten 
<code>foo</code>-Kindelements in eine Zahl und
durch Konvertierung des <termref 
def="dt-string-value">Zeichenkettenwertes</termref> des ersten
<code>bar</code>-Kindelements in eine Zahl entstehen.</p></note>

<!-- Errata ORIG
The * operator performs floating-point multiplication according to 
IEEE 754. Note that, if the result is not NaN, the result is positive 
if and only if both operands have the same sign.
-->

<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> ist die Semantik des 
Operators <code>*</code> nicht spezifiziert. An dieser Stelle muss 
folgender Absatz eingefügt werden:
</p><p>
<phrase role="errata" diff="chg">Der Operator <code>*</code> berechnet 
eine Gleitkomma-Multiplikation gemäß IEEE 754. Beachten Sie: Falls das 
Ergebnis nicht NaN ist, ist das Ergebnis genau dann positiv, wenn beide
Operanden das gleiche Vorzeichen besitzen.</phrase>
</p><p>
Das Zeichen <code>*</code> dient zugleich als Knotentest zur Auswahl
beliebiger Elemente. Welche Semantik ein <code>*</code> innerhalb eines
XPath-Ausdrucks hat, hängt damit von den umgebenden Tokens in diesem
Ausdruck ab (siehe <specref ref="exprlex" />).
</p>
</transnote>

<!-- ORIG
<p>The <code>div</code> operator performs floating-point division
according to IEEE 754.</p>
-->
<p>Der Operator <code>div</code> berechnet eine Gleitkomma-Division
gemäß IEEE 754.</p>

<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz eingefügt werden:
</p><p>
<phrase role="errata" diff="chg">Beachten Sie: Falls das Ergebnis nicht
NaN ist, ist das Ergebnis genau dann positiv, wenn beide Operanden das 
gleiche Vorzeichen besitzen.</phrase>
</p><p>
Der Schrägstrich <code>/</code> ist nicht der Divisionsoperator, da
dieser bereits als Pfadoperator zum Verbinden von 
Lokalisierungsschritten sowie als Symbol für den Wurzelknoten benutzt
wird. Im Gegensatz zum Zeichen <code>*</code> gibt es hier nicht 
mehrere Interpretationsmöglichkeiten.
</p>
</transnote>

<!-- ORIG
<p>The <code>mod</code> operator returns the remainder from a
truncating division.  For example,</p>
-->
<p>Der Operator <code>mod</code> liefert den Rest einer ganzzahligen
Division. Beispiele:</p>

<!-- ORIG
<ulist>
<item><p><code>5 mod 2</code> returns <code>1</code></p></item>
<item><p><code>5 mod -2</code> returns <code>1</code></p></item>
<item><p><code>-5 mod 2</code> returns <code>-1</code></p></item>
<item><p><code>-5 mod -2</code> returns <code>-1</code></p></item>
</ulist>
-->
<ulist>
<item><p><code>5 mod 2</code> ergibt <code>1</code></p></item>
<item><p><code>5 mod -2</code> ergibt <code>1</code></p></item>
<item><p><code>-5 mod 2</code> ergibt <code>-1</code></p></item>
<item><p><code>-5 mod -2</code> ergibt <code>-1</code></p></item>
</ulist>

<!-- ORIG
<note><p>This is the same as the <code>%</code> operator in Java and
ECMAScript.</p></note>
-->
<note><p><code>mod</code> berechnet dasselbe wie der Operator
<code>%</code> in Java und ECMAScript.</p></note>

<!-- ORIG
<note><p>This is not the same as the IEEE 754 remainder operation, which
returns the remainder from a rounding division.</p></note>
-->
<note><p>Er berechnet nicht dasselbe wie die IEEE-754-Rest-Operation, 
welche den Rest einer gerundeten Division liefert.</p></note>

<transnote>
<p>
Der <code>mod</code>-Operator berechnet den genauen Rest, der
sich bei der ganzzahligen Division zweier Gleitkommazahlen ergibt,
ohne die Operanden zuvor auf ganze Zahlen zu runden.
</p>
</transnote>

<scrap>
<!-- ORIG
<head>Numeric Expressions</head>
-->
<head>Numerische Ausdrücke</head>
<prodgroup pcw5="1" pcw2="10" pcw4="21">
<prod id="NT-AdditiveExpr">
<lhs>AdditiveExpr</lhs>
<rhs><nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt></rhs>
<rhs>| <nt def="NT-AdditiveExpr">AdditiveExpr</nt> '+' <nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt></rhs>
<rhs>| <nt def="NT-AdditiveExpr">AdditiveExpr</nt> '-' <nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt></rhs>
</prod>
<prod id="NT-MultiplicativeExpr">
<lhs>MultiplicativeExpr</lhs>
<rhs><nt def="NT-UnaryExpr">UnaryExpr</nt></rhs>
<rhs>| <nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt> <nt def="NT-MultiplyOperator">MultiplyOperator</nt> <nt def="NT-UnaryExpr">UnaryExpr</nt></rhs>
<rhs>| <nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt> 'div' <nt def="NT-UnaryExpr">UnaryExpr</nt></rhs>
<rhs>| <nt def="NT-MultiplicativeExpr">MultiplicativeExpr</nt> 'mod' <nt def="NT-UnaryExpr">UnaryExpr</nt></rhs>
</prod>
<prod id="NT-UnaryExpr">  
<lhs>UnaryExpr</lhs>
<rhs><nt def="NT-UnionExpr">UnionExpr</nt></rhs>
<rhs>| '-' <nt def="NT-UnaryExpr">UnaryExpr</nt></rhs>
</prod>
</prodgroup>
</scrap>

</div2>

<div2 id="strings">
<!-- ORIG
<head>Strings</head>
-->
<head>Zeichenketten</head>

<!-- folgender Tippfehler! "that" -> "than" -->
<!-- ORIG
<p>Strings consist of a sequence of zero or more characters, where a
character is defined as in the XML Recommendation <bibref ref="XML"/>.
A single character in XPath thus corresponds to a single Unicode
abstract character with a single corresponding Unicode scalar value
(see <bibref ref="UNICODE"/>); this is not the same thing as a 16-bit
Unicode code value: the Unicode coded character representation for an
abstract character with Unicode scalar value greater that U+FFFF is a
pair of 16-bit Unicode code values (a surrogate pair).  In many
programming languages, a string is represented by a sequence of 16-bit
Unicode code values; implementations of XPath in such languages must
take care to ensure that a surrogate pair is correctly treated as a
single XPath character.</p>
-->
<p>Zeichenketten bestehen aus einer Folge von null oder mehr Zeichen,
wobei Zeichen wie in der XML-Empfehlung <bibref ref="XML" />
definiert sind. Ein einzelnes XPath-Zeichen entspricht damit einem
einzelnen abstrakten Unicode-Zeichen mit einem einzelnen
korrespondierenden skalaren Wert (siehe <bibref ref="UNICODE" />); 
dies unterscheidet sich allerdings von einem 16-Bit-kodierten
Unicode-Zeichen: Die durch Unicode definierte kodierte 
Zeichenrepräsentation eines abstrakten Zeichens mit einem skalaren Wert
größer als U+FFFF ist ein Paar von 16-Bit Unicode-Codes (ein 
Surrogat-Paar). In vielen Programmiersprachen wird eine Zeichenkette 
als Folge von 16-Bit-kodierten Unicode-Zeichen repräsentiert;
XPath-Implementationen in solchen Sprachen müssen sicherstellen, dass
ein Surrogat-Paar korrekt als einzelnes XPath-Zeichen behandelt
wird.</p>

<!-- ORIG
<note><p>It is possible in Unicode for there to be two strings that
should be treated as identical even though they consist of the
distinct sequences of Unicode abstract characters.  For example, some
accented characters may be represented in either a precomposed or
decomposed form.  Therefore, XPath expressions may return unexpected
results unless both the characters in the XPath expression and in the
XML document have been normalized into a canonical form.  See <bibref
ref="CHARMOD"/>.</p></note>
-->
<note><p>In Unicode ist es möglich, dass zwei Zeichenketten als 
identisch anzusehen sind, obwohl sie aus unterschiedlichen Folgen
abstrakter Unicode-Zeichen bestehen. Zum Beispiel können einige
Akzentzeichen entweder in einer vordefinierten (precomposed) oder einer
zerlegten (decomposed) Form repräsentiert werden. Damit können 
XPath-Ausdrücke unerwartete Resultate liefern, es sei denn, sowohl die 
Zeichen im XPath-Ausdruck als auch die im XML-Dokument wurden zu einer 
kanonischen Form normalisiert (siehe <bibref ref="CHARMOD"/>).</p></note>

<!--
Aus http://www.unicode.org/unicode/standard/principles.html:
'Precomposed characters are another option for some composite
characters. Each precomposed character is represented by a single
code point rather than two or more code points which may combine
during rendering. For example, the character "ü" can be encoded as
the single code point U+00FC  or as the base character U+0075
"u" followed by the non-spacing character U+0308.'
-->

<transnote>
<p>
Ein zusammengesetztes Zeichen, das sich auch als vordefiniertes Zeichen
kodieren lässt, wird durch einen einzigen Unicode-Code repräsentiert. 
Beispielsweise lässt sich der Umlaut »ü« als U+00FC darstellen. 
Zugleich kann dieser Buchstabe auch wie jedes zusammengesetzte Zeichen 
in der zerlegten Form durch die Folge der beiden Codes U+0075 (»u«) und
U+0308 (combining diaeresis) kodiert werden.
</p>
</transnote>

</div2>

<div2 id="exprlex">
<!-- ORIG
<head>Lexical Structure</head>
-->
<head>Lexikalische Struktur</head>

<!-- ORIG
<p>When tokenizing, the longest possible token is always returned.</p>
-->
<p>Beim Zerlegen in einzelne Tokens wird immer das längstmögliche Token
zurückgeliefert.</p>

<!-- Fehler: "expressions" anstelle von "patterns" -->
<!-- ORIG
<p>For readability, whitespace may be used in expressions even though not
explicitly allowed by the grammar: <nt
def="NT-ExprWhitespace">ExprWhitespace</nt> may be freely added within
patterns before or after any <nt
def="NT-ExprToken">ExprToken</nt>.</p>
-->
<p>Zur besseren Lesbarkeit können Leerraumzeichen innerhalb von 
Ausdrücken verwendet werden, auch wenn es nicht explizit durch die 
Grammatik erlaubt wurde: 
<nt def="NT-ExprWhitespace">ExprWhitespace</nt> kann innerhalb von
Ausdrücken frei vor oder nach beliebigen 
<nt def="NT-ExprToken">ExprToken</nt>s eingefügt werden.</p>
<transnote>
<p>
An dieser Stelle sei auf die Anmerkung zum Operator für die 
Subtraktion, das zweistellige Minus, in <specref ref="numbers" />
hingewiesen. Der erste Absatz legt fest, dass »<code>foo-bar</code>«
nur als einzelnes Token interpretiert werden darf und nicht als Folge
der Tokens »<code>foo</code>«, »<code>-</code>« und »<code>bar</code>«. 
Der zweite Absatz erlaubt nun explizit, beispielsweise den 
Minus-Operator mittels Leerraumzeichen als einzeln zu interpretierendes
Token zu kennzeichnen.
</p><p>
Üblicherweise unterscheidet man bei der Definition einer Sprache
zwischen lexikalischen Produktionen, die den Aufbau der lexikalischen
Einheiten, so genannter Tokens festlegen, und syntaktischen Produktionen,
die die mögliche Kombination dieser Tokens zu komplexeren Konstrukten 
beschreiben. In der XPath-Spezifikation sind diese beiden Arten von 
Produktionen allerdings nicht streng voneinander abgegrenzt. Der
Hauptunterschied zwischen lexikalischen und syntaktischen Produktionen
besteht darin, dass zwischen einzelnen Tokens Leerraumzeichen auftreten 
dürfen, nicht jedoch innerhalb eines Tokens. Die Produktion für das 
Nichtterminal <nt def="NT-ExprToken">ExprToken</nt> stellt damit die 
oberste lexikalische Produktion dar. Daraus ergibt sich, dass ein 
Leerzeichen zwischen <code>@</code> und einem 
<xnt href="&XMLNames;#NT-QName">QName</xnt>
zur Abkürzung der <code>attribute</code>-Achse erlaubt ist, nicht aber 
zwischen <code>$</code> und einem
<xnt href="&XMLNames;#NT-QName">QName</xnt>
bei Variablenreferenzen.
</p>
</transnote>

<!-- ORIG
<p>The following special tokenization rules must be applied in the
order specified to disambiguate the <nt
def="NT-ExprToken">ExprToken</nt> grammar:</p>
-->
<p>Die folgenden speziellen Regeln für die Zerlegung in Tokens müssen in
der angegebenen Reihenfolge angewendet werden, um die Grammatik <nt
def="NT-ExprToken">ExprToken</nt> eindeutig zu machen:</p>

<ulist>

<!-- ORIG
<item><p>If there is a preceding token and the preceding token is not
one of <code>@</code>, <code>::</code>, <code>(</code>,
<code>[</code>, <code>,</code> or an <nt
def="NT-Operator">Operator</nt>, then a <code>*</code> must be
recognized as a <nt def="NT-MultiplyOperator">MultiplyOperator</nt>
and an <xnt href="&XMLNames;#NT-NCName">NCName</xnt> must be
recognized as an <nt
def="NT-OperatorName">OperatorName</nt>.</p></item>
-->
<item><p>Wenn es ein vorhergehendes Token gibt und dieses Token
kein <code>@</code>, <code>::</code>, <code>(</code>,
<code>[</code>, <code>,</code> oder ein <nt
def="NT-Operator">Operator</nt> ist, dann muss ein <code>*</code> als
<nt def="NT-MultiplyOperator">MultiplyOperator</nt> und ein 
<xnt href="&XMLNames;#NT-NCName">NCName</xnt> als <nt 
def="NT-OperatorName">OperatorName</nt> erkannt werden.</p></item>

<!-- ORIG
<item><p>If the character following an <xnt
href="&XMLNames;#NT-NCName">NCName</xnt> (possibly after intervening
<nt def="NT-ExprWhitespace">ExprWhitespace</nt>) is <code>(</code>,
then the token must be recognized as a <nt
def="NT-NodeType">NodeType</nt> or a <nt
def="NT-FunctionName">FunctionName</nt>.</p></item>
-->
<item><p>Falls das einem <xnt href="&XMLNames;#NT-NCName">NCName</xnt> 
folgende Zeichen (möglicherweise nach dazwischenliegendem 
<nt def="NT-ExprWhitespace">ExprWhitespace</nt>) das Zeichen
<code>(</code> ist, dann muss das Token als <nt
def="NT-NodeType">NodeType</nt> oder als <nt
def="NT-FunctionName">FunctionName</nt> erkannt werden.</p></item>

<!-- ORIG
<item><p>If the two characters following an <xnt
href="&XMLNames;#NT-NCName">NCName</xnt> (possibly after intervening
<nt def="NT-ExprWhitespace">ExprWhitespace</nt>) are <code>::</code>,
then the token must be recognized as an <nt
def="NT-AxisName">AxisName</nt>.</p></item>
-->
<item><p>Falls die einem <xnt
href="&XMLNames;#NT-NCName">NCName</xnt> folgenden beiden Zeichen 
(möglicherweise nach dazwischenliegendem 
<nt def="NT-ExprWhitespace">ExprWhitespace</nt>) die Zeichen
<code>::</code> sind, dann muss das Token als <nt
def="NT-AxisName">AxisName</nt> erkannt werden.</p></item>

<!-- ORIG
<item><p>Otherwise, the token must not be recognized as a <nt
def="NT-MultiplyOperator">MultiplyOperator</nt>, an <nt
def="NT-OperatorName">OperatorName</nt>, a <nt
def="NT-NodeType">NodeType</nt>, a <nt
def="NT-FunctionName">FunctionName</nt>, or an <nt
def="NT-AxisName">AxisName</nt>.</p></item>
-->
<item><p>Andernfalls darf das Token nicht als <nt
def="NT-MultiplyOperator">MultiplyOperator</nt>, als <nt
def="NT-OperatorName">OperatorName</nt>, als <nt
def="NT-NodeType">NodeType</nt>, als <nt
def="NT-FunctionName">FunctionName</nt> oder als <nt
def="NT-AxisName">AxisName</nt> erkannt werden.</p></item>

</ulist>

<transnote>
<p>
Im zweiten Aufzählungspunkt des Originaldokuments hat sich ein Fehler 
eingeschlichen. Da Funktionsnamen mit einem Präfix ausgestattet sein 
können, muss laut Errata-Dokument <bibref ref="ERRATA" /> auf 
<xnt href="&XMLNames;#NT-QName">QName</xnt>
statt auf
<xnt href="&XMLNames;#NT-NCName">NCName</xnt>
verwiesen werden. Alle Standardfunktionen aus XPath, XSLT und XPointer 
besitzen zwar nur Namen ohne Präfix, der Erweiterungsmechanismus in 
XSLT erlaubt jedoch XSLT-Implementationen, zusätzliche Funktionen 
aus einem proprietären Namensraum zur Verfügung zu stellen.
</p><p>
Das hier diskutierte Problem der Mehrdeutigkeit umgeht man in vielen 
anderen Programmiersprachen durch die Definition von Schlüsselwörtern,
die dann für frei wählbare Bezeichner nicht mehr zur Verfügung stehen. 
Ein XML-Autor ist jedoch frei in seiner Wahl der Element- und 
Attributnamen, also muss auch die Sprache XPath damit umgehen
können. Die gefundene Regelung ermöglicht eine kompakte Schreibweise 
für XPath-Ausdrücke und bürdet die Last der eindeutigen Interpretation 
der jeweiligen XPath-Implementation auf.
</p><p>
Die folgenden Beispiele zeigen, wie Bezeichner (und der 
<code>*</code>-Operator) abhängig vom Kontext unterschiedlich 
interpretiert werden müssen:
</p>
<ulist>
<item>
   <eg>***</eg>
   <p>bestimmt jeweils den in eine Zahl konvertierten Zeichenkettenwert 
   der ersten Knoten in den durch <code>*</code> repräsentierten 
   Knotenmengen aller Kindelemente und multipliziert diese miteinander,
   d.h. das erste und dritte <code>*</code> werden als 
   Lokalisierungspfad, das mittlere <code>*</code> als 
   Multiplikationsoperator interpretiert.</p>
</item>
<item>
   <eg>and or mod</eg>
   <p>ergibt den Wert <emph>wahr</emph>, wenn der Kontextknoten 
   wenigstens ein Kindelement namens <code>and</code> oder ein 
   Kindelement namens <code>mod</code> besitzt (Operatorname versus 
   Elementname).</p>
</item>
<item>
   <eg>text and text()</eg>
   <p>ergibt den Wert <emph>wahr</emph>, wenn der Kontextknoten sowohl 
   wenigstens ein Element namens <code>text</code> als auch wenigstens 
   einen Textknoten als Kinder besitzt (Knotentyp versus 
   Elementname).</p>
</item>
<item>
   <eg>position() = position</eg>
   <p>ergibt den Wert <emph>wahr</emph>, wenn die aktuelle 
   Kontextposition mit dem in eine Zahl konvertierten Zeichenkettenwert
   eines Kindelements namens <code>position</code> übereinstimmt 
   (Funktionsname versus Elementname).</p>
</item>
<item>
   <eg>parent or parent::child</eg>
   <p>ergibt den Wert <emph>wahr</emph>, wenn der Kontextknoten ein 
   Kindelement namens <code>parent</code> oder ein Elternelement namens
   <code>child</code> besitzt (Achsenname versus Elementname).</p>
</item>
</ulist>
</transnote>

<scrap>
<!-- ORIG
<head>Expression Lexical Structure</head>
-->
<head>Lexikalische Struktur von Ausdrücken</head>
<prodgroup pcw5="1" pcw2="8" pcw4="21">
<prod id="NT-ExprToken">
<lhs>ExprToken</lhs>
<rhs>'(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'</rhs>
<rhs>| <nt def="NT-NameTest">NameTest</nt></rhs>
<rhs>| <nt def="NT-NodeType">NodeType</nt></rhs>
<rhs>| <nt def="NT-Operator">Operator</nt></rhs>
<rhs>| <nt def="NT-FunctionName">FunctionName</nt></rhs>
<rhs>| <nt def="NT-AxisName">AxisName</nt></rhs>
<rhs>| <nt def="NT-Literal">Literal</nt></rhs>
<rhs>| <nt def="NT-Number">Number</nt></rhs>
<rhs>| <nt def="NT-VariableReference">VariableReference</nt></rhs>
</prod>
<prod id="NT-Literal">
<lhs>Literal</lhs>
<rhs>'"' [^"]* '"'</rhs>
<rhs>| "'" [^']* "'"</rhs>
</prod>
<prod id="NT-Number">
<lhs>Number</lhs>
<rhs><nt def="NT-Digits">Digits</nt> ('.' <nt def="NT-Digits">Digits</nt>?)?</rhs>
<rhs>| '.' <nt def="NT-Digits">Digits</nt></rhs>
</prod>
<prod id="NT-Digits">
<lhs>Digits</lhs>
<rhs>[0-9]+</rhs>
</prod>
<prod id="NT-Operator">
<lhs>Operator</lhs>
<rhs><nt def="NT-OperatorName">OperatorName</nt></rhs>
<rhs>| <nt def="NT-MultiplyOperator">MultiplyOperator</nt></rhs>
<rhs>| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '&lt;' | '&lt;=' | '&gt;' | '&gt;='</rhs>
</prod>
<prod id="NT-OperatorName">
<lhs>OperatorName</lhs>
<rhs>'and' | 'or' | 'mod' | 'div'</rhs>
</prod>
<prod id="NT-MultiplyOperator">
<lhs>MultiplyOperator</lhs>
<rhs>'*'</rhs>
</prod>
<prod id="NT-FunctionName">
<lhs>FunctionName</lhs>
<rhs>
<xnt href="&XMLNames;#NT-QName">QName</xnt>
- <nt def="NT-NodeType">NodeType</nt>
</rhs>
</prod>
<prod id="NT-VariableReference">
<lhs>VariableReference</lhs>
<rhs>'$' <xnt href="&XMLNames;#NT-QName">QName</xnt></rhs>
</prod>
<prod id="NT-NameTest">
<lhs>NameTest</lhs>
<rhs>'*'</rhs>
<rhs>| <xnt href="&XMLNames;#NT-NCName">NCName</xnt> ':' '*'</rhs>
<rhs>| <xnt href="&XMLNames;#NT-QName">QName</xnt></rhs>
</prod>
<prod id="NT-NodeType">
<lhs>NodeType</lhs>
<rhs>'comment'</rhs>
<rhs>| 'text'</rhs>
<rhs>| 'processing-instruction'</rhs>
<rhs>| 'node'</rhs>
</prod>
<prod id="NT-ExprWhitespace">
<lhs>ExprWhitespace</lhs>
<rhs><xnt href="&XML;#NT-S">S</xnt></rhs>
</prod>
</prodgroup>
</scrap>

</div2>

</div1>

<div1 id="corelib">
<!-- ORIG
<head>Core Function Library</head>
-->
<head>Bibliothek der Grundfunktionen</head>

<!-- ORIG
<p>This section describes functions that XPath implementations must
always include in the function library that is used to evaluate
expressions.</p>
-->
<p>Dieser Abschnitt beschreibt die Funktionen, die bei einer
XPath-Implementation immer in der bei der Auswertung von Ausdrücken
benutzten Funktionsbibliothek enthalten sein müssen.</p>

<!-- ORIG
<p>Each function in the function library is specified using a function
prototype, which gives the return type, the name of the function, and
the type of the arguments.  If an argument type is followed by a
question mark, then the argument is optional; otherwise, the argument
is required.</p>
-->
<p>Jede Funktion in der Funktionsbibliothek wird über einen
Funktionsprototypen spezifiziert, der den Rückgabetyp, den Namen der
Funktion und die Typen der Argumente angibt. Falls ein Argument von
einem Fragezeichen gefolgt wird, so ist es optional; andernfalls ist
es obligatorisch.</p>
<transnote>
<p>
Ein Funktionsargument, dem ein Stern <code>*</code> folgt,
darf keinmal, einmal oder mehrmals auftreten. Der Argumenttyp
<emph>object</emph> steht für einen beliebigen Typ.
</p>
</transnote>

<div2 id="node-set-functions">
<!-- ORIG
<head>Node Set Functions</head>
-->
<head>Funktionen auf Knotenmengen</head>

<proto name="last" return-type="number"></proto>

<!-- ORIG
<p>The <function>last</function> function returns a number equal to
the <termref def="dt-context-size">context size</termref> from the
expression evaluation context.</p>
-->
<p>Die Funktion <function>last</function> liefert eine Zahl, die gleich
der <termref def="dt-context-size">Kontextgröße</termref> des Kontexts
des ausgewerteten Ausdrucks ist.</p>

<proto name="position" return-type="number"></proto>

<!-- ORIG
<p>The <function>position</function> function returns a number equal to
the <termref def="dt-context-position">context position</termref> from
the expression evaluation context.</p>
-->
<p>Die Funktion <function>position</function> liefert eine Zahl, die
gleich der <termref def="dt-context-position">Kontextposition</termref>
im Kontext des ausgewerteten Ausdrucks ist.</p>

<proto name="count" return-type="number"><arg type="node-set"/></proto>

<!-- ORIG
<p>The <function>count</function> function returns the number of nodes in the
argument node-set.</p>
-->
<p>Die Funktion <function>count</function> liefert die Anzahl der
Knoten der übergebenen Knotenmenge.</p>

<transnote>
<p>
Für den letzten Knoten einer Knotenmenge gilt damit die Gleichheit
<code>position()=last()</code>. Beachten Sie, dass die Nummerierung
der Knoten bei 1 beginnt.
</p><p>
Während <function>last</function> also die Kontextgröße zurückgibt,
d.h. die Anzahl der Knoten der Knotenmenge, in der sich der
Kontextknoten befindet, berechnet <function>count</function> die Anzahl
der Knoten einer beliebigen als Argument zu übergebenden Knotenmenge.
Es gibt keinen XPath-Ausdruck, der für einen beliebigen Knoten dessen
Position in einer vorgegebenen Knotenmenge berechnet.
</p><p>
In bestimmten Situationen lässt sich jedoch das Wissen über die Art der
Beziehungen der Knoten in der Knotenmenge ausnutzen. Möchte man
beispielsweise herausfinden, welche Position das erste
<code>para</code>-Kind mit dem Attribut <code>type="warning"</code>
unter allen <code>para</code>-Kindern besitzt, kann man einfach die 
diesem Element vorangehenden <code>para</code>-Geschwister zählen und 
1 addieren:
</p>
<eg>count(para[@type="warning"]/preceding-sibling::para)+1</eg>
<p>
Diese Methode funktioniert hier deshalb, weil klar ist, dass alle
<code>para</code>-Elemente Geschwister sind und auf die vorherigen 
Knoten der Menge daher über die Achse <code>preceding-sibling</code> 
zugegriffen werden kann. Wenn nicht bekannt ist, wie die Knotenmenge
gebildet wurde, können die anderen Knoten auch nicht bestimmt und
gezählt werden.
</p><p>
In Kapitel <specref ref="node-sets" /> wird im Zusammenhang mit dem
Mengenvereinigungsoperator <code>|</code> gezeigt, wie die Funktion
<function>count</function> zur Bestimmung von Durchschnitt und
Differenz zweier Mengen genutzt werden kann.
</p>
</transnote>

<proto name="id" return-type="node-set"><arg type="object"/></proto>

<!-- ORIG
<p>The <function>id</function> function selects elements by their
unique ID (see <specref ref="unique-id"/>).  When the argument to
<function>id</function> is of type node-set, then the result is the
union of the result of applying <function>id</function> to the
<termref def="dt-string-value">string-value</termref> of each of the
nodes in the argument node-set.  When the argument to
<function>id</function> is of any other type, the argument is
converted to a string as if by a call to the
<function>string</function> function; the string is split into a
whitespace-separated list of tokens (whitespace is any sequence of
characters matching the production <xnt href="&XML;#NT-S">S</xnt>);
the result is a node-set containing the elements in the same document
as the context node that have a unique ID equal to any of the tokens
in the list.</p>
-->
<p>Die Funktion <function>id</function> wählt Elemente anhand ihrer
eindeutigen ID aus (siehe <specref ref="unique-id"/>). Wenn als
Argument eine Knotenmenge übergeben wird, so ergibt sich das Ergebnis 
aus der Vereinigung der Knotenmengen, die durch den Aufruf von 
<function>id</function> mit dem <termref 
def="dt-string-value">Zeichenkettenwert</termref> jedes Knotens aus 
der übergebenen Knotenmenge berechnet werden. Ist das Argument der
Funktion <function>id</function> von einem beliebigen anderen Typ,
so wird es wie bei einem Aufruf der Funktion <function>string</function>
in eine Zeichenkette konvertiert; die Zeichenkette wird in eine
durch Leerraumzeichen getrennte Liste von Tokens aufgeteilt 
(Leerraumzeichen sind beliebige Folgen von Zeichen, die sich aus der
Produktion <xnt href="&XML;#NT-S">S</xnt> ableiten lassen). Das
Ergebnis ist eine Knotenmenge, die die Elemente aus dem Dokument des 
Kontextknotens enthält, die eine eindeutige ID mit dem gleichen Wert 
wie eines der Tokens der Liste besitzen.</p>

<ulist>
<!-- ORIG
<item><p><code>id("foo")</code> selects the element with unique ID
<code>foo</code></p></item>
-->
<item><p><code>id("foo")</code> wählt die Elemente mit der eindeutigen
ID <code>foo</code> aus.</p></item>
<!-- ORIG
<item><p><code>id("foo")/child::para[position()=5]</code> selects
the fifth <code>para</code> child of the element with unique ID
<code>foo</code></p></item>
-->
<item><p><code>id("foo")/child::para[position()=5]</code> wählt das
fünfte <code>para</code>-Kindelement des Elements mit der eindeutigen
ID <code>foo</code> aus.</p></item>
</ulist>

<transnote>
<p>
Diese Funktion ermöglicht die Auswertung von Attributen des
Typs <code>IDREF</code> bzw. <code>IDREFS</code>. Da ein
<code>IDREF</code>-Wert als ID an ein Element im gleichen XML-Dokument 
vergeben worden sein muss, lässt sich dieses Element mit Hilfe 
der Funktion <function>id</function> bestimmen. Handelt
es sich um mehrere IDs als Wert eines <code>IDREFS</code>-Attributs,
liefert <function>id</function> alle zugehörigen Elemente als
Knotenmenge.
</p><p>
Entsprechend der obigen Definition gilt also:
</p>
<eg>id("foo bar baz") = id("foo") | id("bar") | id("baz")</eg>
<p>
Die Knoten in der Ergebnisknotenmenge werden durch ein folgendes
Prädikat in <termref def="dt-document-order">Dokumentordnung</termref>
gefiltert und nicht in der Reihenfolge der angegebenen IDs.
</p><p>
Dagegen wird bei der Übergabe einer Knotenmenge, wie im Beispiel 
<code>id(foo)</code>, von allen Knoten der Menge deren 
Zeichenkettenwert als Parameter verarbeitet und dieser wie ein 
<code>IDREFS</code>-Attribut interpretiert. Das Ergebnis ist die 
Vereinigung aller auf diese Weise bestimmten Knoten.
</p><p>
Die Funktion <function>id</function> kann aber nur korrekt arbeiten,
wenn <code>ID</code>-wertige Attribute als solche erkannt werden.
Dazu muss die DTD bekannt und vom Parser ausgewertet worden sein.
Dies ist einer der wenigen Fälle, in denen das Ergebnis eines
XPath-Ausdrucks von der Kenntnis der DTD des Dokuments abhängt.
Fehlt diese Information, liefert <function>id</function> immer eine
leere Knotenmenge.
</p><p>
Es gibt keine komplementäre Funktion, die für ein Element
dessen ID zurückliefert. Unter Zuhilfenahme von 
<function>id</function> lässt sich diese Information allerdings
herausfinden. Gesucht ist nämlich genau das Attribut, für das die 
Funktion <function>id</function> den Elternknoten dieses Attributs 
liefert:
</p>
<eg>@*[id(.) and count(id(.)|..)=1]</eg>
</transnote>

<proto name="local-name" return-type="string"><arg occur="opt" type="node-set"/></proto>

<!-- ORIG
<p>The <function>local-name</function> function returns the local part
of the <termref def="dt-expanded-name">expanded-name</termref> of the
node in the argument node-set that is first in <termref
def="dt-document-order">document order</termref>. If the argument
node-set is empty or the first node has no <termref
def="dt-expanded-name">expanded-name</termref>, an empty string is
returned.  If the argument is omitted, it defaults to a node-set with
the context node as its only member.</p>
-->
<p>Die Funktion <function>local-name</function> liefert den lokalen
Teil des <termref def="dt-expanded-name">erweiterten Namens</termref> 
des ersten Knotens in der Argumentknotenmenge bezüglich der <termref
def="dt-document-order">Dokumentordnung</termref>. Falls die
übergebene Knotenmenge leer ist oder der erste Knoten keinen
<termref def="dt-expanded-name">erweiterten Namen</termref> besitzt,
wird eine leere Zeichenkette zurückgegeben. Wird kein Argument
übergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als
einzigem Element benutzt.</p>
<transnote>
<p>
Für Element- und Attributknoten gilt damit, dass die Funktion 
<function>local-name</function> den dem Doppelpunkt folgenden Teil des
<xnt href="&XMLNames;#NT-QName">QName</xnt> zurückgibt bzw. den 
vollständigen Namen, wenn dieser kein Präfix enthält. Die folgenden 
Beispiele demonstrieren dies unter der Voraussetzung, dass der als 
jeweiliges Argument übergebene Lokalisierungspfad nicht die leere 
Knotenmenge ergibt:
</p>
<eg>
local-name(xhtml:body) = "body"
local-name(@xlink:href) = "href"
local-name(para) = "para"
</eg>
<p>
Für Namensraumknoten liefert <function>local-name</function> das
zugewiesene Präfix, also beispielsweise für die Deklaration
<code>xmlns:xlink="http://www.w3.org/1999/xlink"</code> die
Zeichenkette »<code>xlink</code>«. Für Namensraumknoten, die den
voreingestellten Namensraum repräsentieren, wird die leere Zeichenkette
zurückgegeben.
</p><p>
Für Processing Instructions liefert <function>local-name</function>
das jeweilige Ziel, also beispielsweise für
<code>&lt;?xml-stylesheet href='style.xsl'?&gt;</code> die
Zeichenkette »<code>xml-stylesheet</code>«.
</p><p>
Für Textknoten, Kommentare und den Wurzelknoten liefert 
<function>local-name</function> die leere Zeichenkette.
</p>
</transnote>

<proto name="namespace-uri" return-type="string"><arg occur="opt"
type="node-set"/></proto>

<!-- ORIG
<p>The <function>namespace-uri</function> function returns the
namespace URI of the <termref
def="dt-expanded-name">expanded-name</termref> of the node in the
argument node-set that is first in <termref
def="dt-document-order">document order</termref>. If the argument
node-set is empty, the first node has no <termref
def="dt-expanded-name">expanded-name</termref>, or the namespace URI
of the <termref def="dt-expanded-name">expanded-name</termref> is
null, an empty string is returned.  If the argument is omitted, it
defaults to a node-set with the context node as its only member.</p>
-->
<p>Die Funktion <function>namespace-uri</function> liefert den
Namensraum-URI des
<termref def="dt-expanded-name">erweiterten Namens</termref> des
ersten Knotens in der Argumentknotenmenge bezüglich der <termref
def="dt-document-order">Dokumentordnung</termref>. Falls die
übergebene Knotenmenge leer ist, der erste Knoten keinen
<termref def="dt-expanded-name">erweiterten Namen</termref> besitzt
oder der Namensraum-URI des
<termref def="dt-expanded-name">erweiterten Namens</termref> leer ist,
wird eine leere Zeichenkette zurückgegeben. Wird kein Argument
übergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als
einzigem Element benutzt.</p>

<!-- ORIG
<note><p>The string returned by the
<function>namespace-uri</function> function will be empty except for
element nodes and attribute nodes.</p></note>
-->
<note><p>Die von der Funktion <function>namespace-uri</function>
zurückgegebene Zeichenkette ist außer für Element- oder Attributknoten 
immer leer.</p></note>

<transnote>
<p>
Beispiele:
<code>namespace-uri(xhtml:body)</code> liefert den zum Präfix
<code>xhtml</code> gehörenden Namensraum-URI (z.B.
»<code>http://www.w3.org/1999/xhtml</code>«), entsprechend ergibt
<code>namespace-uri(@xlink:href)</code> die Zeichenkette
»<code>http://www.w3.org/1999/xlink</code>«, falls das Präfix 
<code>xlink</code> an diesen URI gebunden wurde. Für Elementknoten aus
dem voreingestellten Namensraum liefert
<function>namespace-uri</function> den dazugehörigen URI. Für Element-
und Attributknoten, die keinem Namensraum angehören, wird die leere 
Zeichenkette zurückgegeben.
</p>
</transnote>

<proto name="name" return-type="string"><arg occur="opt" type="node-set"/></proto>

<!-- ORIG
<p>The <function>name</function> function returns a string containing
a <xnt href="&XMLNames;#NT-QName">QName</xnt> representing the
<termref def="dt-expanded-name">expanded-name</termref> of the node in
the argument node-set that is first in <termref
def="dt-document-order">document order</termref>. The <xnt
href="&XMLNames;#NT-QName">QName</xnt> must represent the <termref
def="dt-expanded-name">expanded-name</termref> with respect to the
namespace declarations in effect on the node whose <termref
def="dt-expanded-name">expanded-name</termref> is being represented.
Typically, this will be the <xnt
href="&XMLNames;#NT-QName">QName</xnt> that occurred in the XML
source.  This need not be the case if there are namespace declarations
in effect on the node that associate multiple prefixes with the same
namespace.  However, an implementation may include information about
the original prefix in its representation of nodes; in this case, an
implementation can ensure that the returned string is always the same
as the <xnt href="&XMLNames;#NT-QName">QName</xnt> used in the XML
source. If the argument node-set is empty or the first node has no
<termref def="dt-expanded-name">expanded-name</termref>, an empty
string is returned.  If the argument it omitted, it defaults to a
node-set with the context node as its only member.</p>
-->
<p>Die Funktion <function>name</function> liefert eine Zeichenkette mit 
einem <xnt href="&XMLNames;#NT-QName">QName</xnt>, die den
<termref def="dt-expanded-name">erweiterten Namen</termref> des
ersten Knotens in der Argumentknotenmenge bezüglich der <termref
def="dt-document-order">Dokumentordnung</termref> repräsentiert. Der
<xnt href="&XMLNames;#NT-QName">QName</xnt> muss den <termref
def="dt-expanded-name">erweiterten Namen</termref> unter 
Berücksichtigung der Namensraumdeklarationen repräsentieren, die für
den Knoten gültig sind, dessen <termref
def="dt-expanded-name">erweiterter Name</termref> repräsentiert wird.
Typischerweise ist das der <xnt
href="&XMLNames;#NT-QName">QName</xnt>, der in der XML-Quelle
vorkommt. Das muss nicht der Fall sein, wenn es für den Knoten
Namensraumdeklarationen gibt, die dem gleichen Namensraum mehrere 
Präfixe zuordnen. Allerdings kann eine Implementation Informationen
über das Originalpräfix speichern; in diesem Fall kann die 
Implementation sicherstellen, dass der zurückgegebene String immer
der in der XML-Quelle benutzte <xnt 
href="&XMLNames;#NT-QName">QName</xnt> ist. Falls die
übergebene Knotenmenge leer ist oder der erste Knoten keinen
<termref def="dt-expanded-name">erweiterten Namen</termref> besitzt,
wird eine leere Zeichenkette zurückgegeben. Wird kein Argument
übergeben, wird stattdessen eine Knotenmenge mit dem Kontextknoten als
einzigem Element benutzt.</p>

<!-- ORIG
<note><p>The string returned by the <function>name</function> function
will be the same as the string returned by the
<function>local-name</function> function except for element nodes and
attribute nodes.</p></note>
-->
<note><p>Die von der Funktion <function>name</function> gelieferte
Zeichenkette ist die gleiche wie die von der Funktion
<function>local-name</function> gelieferte, außer für Element- und
Attributknoten.</p></note>

<transnote>
<p>
Für einen folgendermaßen definierten Elementknoten 
</p>
<eg>&lt;x:foo xmlns:x="urn:bar" xmlns:y="urn:bar" /&gt;</eg>
<p>
darf die Funktion <function>name</function> damit
die Zeichenkette »<code>y:foo</code>« liefern, da durch das Präfix
<code>y</code> der gleiche Namensraum repräsentiert wird wie durch
<code>x</code>.
</p><p>
Die drei Funktionen <function>local-name</function>, 
<function>namespace-uri</function> und <function>name</function>
werden in der folgenden Tabelle kurz zusammengefasst.
Das Zeichen »<code>-</code>« steht dabei für die leere Zeichenkette:
</p>
<table border="1" cellpadding="3" cellspacing="0"><tbody>
   <tr>
      <td/>
      <th><function>local-name</function></th>
      <th><function>namespace-uri</function></th>
      <th><function>name</function></th>
   </tr><tr>
      <td><specref ref="root-node" /></td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
   </tr><tr>
      <td><specref ref="element-nodes" /></td>
      <td>Name ohne Präfix</td>
      <td>URI des Namensraums, in dem sich das Element befindet</td>
      <td>voller Name</td>
   </tr><tr>
      <td><specref ref="attribute-nodes" /></td>
      <td>Name ohne Präfix</td>
      <td>URI des Namensraums, in dem sich das Attribut befindet</td>
      <td>voller Name</td>
   </tr><tr>
      <td><specref ref="namespace-nodes" /></td>
      <td>Namensraum-Präfix</td>
      <td>-</td>
      <td>Namensraum-Präfix</td>
   </tr><tr>
      <td><specref ref="pi-nodes" /></td>
      <td>Ziel</td>
      <td>-</td>
      <td>Ziel</td>
   </tr><tr>
      <td><specref ref="comment-nodes" /></td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
   </tr><tr>
      <td><specref ref="text-nodes" /></td>
      <td>-</td>
      <td>-</td>
      <td>-</td>
   </tr>
</tbody></table>
<p>
Diese Funktionen erwarten als Argument zwar eine Knotenmenge,
werten jedoch immer nur den ersten Knoten bezüglich der 
<termref def="dt-document-order">Dokumentordnung</termref> aus.
Der zugrunde liegende Begriff
<termref def="dt-expanded-name">erweiterter Name</termref> wird in 
Kapitel <specref ref="data-model" /> erläutert.
</p><p>
Über den Umweg, den Namen eines Knotens auszuwerten, lassen sich
Knotentests variabel beschreiben. Möchte man beispielsweise den Typ 
eines Nachkommenelements parametrisieren, kann man nicht 
<code>descendant::$name</code> verwenden.
Mittels der Funktionen <function>local-name</function> und 
<function>namespace-uri</function> lässt sich das Problem
lösen, indem zunächst alle Nachkommenelemente in die 
Ausgangsknotenmenge aufgenommen und anschließend innerhalb eines 
Prädikats diejenigen mit dem richtigen Namen und dem richtigen 
Namensraum herausgefiltert werden:
</p>
<eg>descendant::*[local-name()=$lname and namespace-uri()=$uri]</eg>
<p>
Für XML-Dokumente, die keinen Gebrauch von Namensräumen machen,
reicht bereits ein Vergleich mit der von der Funktion
<function>name</function> gelieferten Zeichenkette.
</p>
</transnote>

</div2>

<div2 id="string-functions">
<!-- ORIG
<head>String Functions</head>
-->
<head>Zeichenkettenfunktionen</head>

<proto name="string" return-type="string"><arg occur="opt" type="object"/></proto>

<!-- ORIG
<p>The <function>string</function> function converts an object to a string
as follows:</p>
-->
<p>Die Funktion <function>string</function> konvertiert ein Objekt wie
folgt in eine Zeichenkette:</p>

<ulist>

<!-- ORIG
<item><p>A node-set is converted to a string by returning the <termref
def="dt-string-value">string-value</termref> of the node in the
node-set that is first in <termref def="dt-document-order">document
order</termref>.  If the node-set is empty, an empty string is
returned.</p></item>
-->
<item><p>Eine Knotenmenge wird in eine Zeichenkette konvertiert, indem 
der <termref def="dt-string-value">Zeichenkettenwert</termref> des 
ersten Knotens in
<termref def="dt-document-order">Dokumentordnung</termref> 
zurückgegeben wird. Falls die Knotenmenge leer ist, wird eine leere 
Zeichenkette zurückgegeben.</p>
<transnote>
<p>
Der <termref def="dt-string-value">Zeichenkettenwert</termref> für 
jeden Knotentyp wird in Kapitel <specref ref="data-model" /> definiert.
An dieser Stelle wird bereits zusammengefasst,
welchen Wert die Funktion <function>string</function> abhängig vom
jeweiligen Knotentyp zurückgibt.
</p>
<table border="1" cellpadding="3" cellspacing="0"><tbody>
   <tr>
      <td/>
      <th><function>string</function></th>
   </tr><tr>
      <td><specref ref="root-node" /></td>
      <td><termref def="dt-string-value">Zeichenkettenwert</termref> 
          des Dokumentelements (des einzigen Kindes des 
          Wurzelknotens)</td>
   </tr><tr>
      <td><specref ref="element-nodes" /></td>
      <td>Verkettung der 
          <termref def="dt-string-value">Zeichenkettenwerte</termref> 
          aller Element- und Text-Kindknoten</td>
   </tr><tr>
      <td><specref ref="attribute-nodes" /></td>
      <td>normalisierter Attributwert</td>
   </tr><tr>
      <td><specref ref="namespace-nodes" /></td>
      <td>URI, d.h. Name des Namensraumes</td>
   </tr><tr>
      <td><specref ref="pi-nodes" /></td>
      <td>Inhalt, der dem Ziel der Processing Instruction folgt</td>
   </tr><tr>
      <td><specref ref="comment-nodes" /></td>
      <td>Kommentarinhalt</td>
   </tr><tr>
      <td><specref ref="text-nodes" /></td>
      <td>enthaltene Zeichendaten</td>
   </tr>
</tbody></table>
</transnote>
</item>

<item>
<!-- ORIG
<p>A number is converted to a string as follows</p>
-->
<p>Eine Zahl wird wie folgt in eine Zeichenkette konvertiert:</p>

<ulist>

<!-- ORIG
<item><p>NaN is converted to the string <code>NaN</code></p></item>
-->
<item><p>NaN (Not a Number &ndash; keine gültige Zahl) wird in die
Zeichenkette <code>NaN</code> konvertiert.</p></item>

<!-- ORIG
<item><p>positive zero is converted to the string
<code>0</code></p></item>
-->
<item><p>Positiv Null wird in die Zeichenkette <code>0</code>
konvertiert.</p></item>

<!-- ORIG
<item><p>negative zero is converted to the string
<code>0</code></p></item>
-->
<item><p>Negativ Null wird in die Zeichenkette <code>0</code>
konvertiert.</p></item>

<!-- ORIG
<item><p>positive infinity is converted to the string
<code>Infinity</code></p></item>
-->
<item><p>Positiv unendlich wird in die Zeichenkette
<code>Infinity</code> konvertiert.</p></item>

<!-- ORIG
<item><p>negative infinity is converted to the string
<code>-Infinity</code></p></item>
-->
<item><p>Negativ unendlich wird in die Zeichenkette
<code>-Infinity</code> konvertiert.</p></item>

<!-- ORIG
<item><p>if the number is an integer, the number is represented in
decimal form as a <nt def="NT-Number">Number</nt> with no decimal
point and no leading zeros, preceded by a minus sign (<code>-</code>)
if the number is negative</p></item>
-->
<item><p>Falls die Zahl ein Integer ist, wird sie in dezimaler Form
als <nt def="NT-Number">Number</nt> dargestellt, ohne Dezimalpunkt
und führende Nullen, mit negativem Vorzeichen (<code>-</code>), falls
die Zahl negativ ist.</p></item>

<!-- ORIG
<item><p>otherwise, the number is represented in decimal form as a <nt
def="NT-Number">Number</nt> including a decimal point with at least
one digit before the decimal point and at least one digit after the
decimal point, preceded by a minus sign (<code>-</code>) if the number
is negative; there must be no leading zeros before the decimal point
apart possibly from the one required digit immediately before the
decimal point; beyond the one required digit after the decimal point
there must be as many, but only as many, more digits as are needed to
uniquely distinguish the number from all other IEEE 754 numeric
values.</p></item>
-->
<item><p>Ansonsten wird die Zahl in Dezimalform als <nt
def="NT-Number">Number</nt> dargestellt, einschließlich Dezimalpunkt,
wenigstens einer Ziffer vor und nach dem Dezimalpunkt sowie einem
negativen Vorzeichen (<code>-</code>), falls die Zahl negativ ist.
Es dürfen keine führenden Nullen vor dem Dezimalpunkt auftreten mit
Ausnahme der eventuell erforderlichen Ziffer direkt vor dem
Dezimalpunkt. Abgesehen von der einen erforderlichen Ziffer nach dem
Dezimalpunkt müssen dort so viele, aber nicht mehr, Ziffern auftreten,
wie zur eindeutigen Unterscheidung von allen anderen IEEE 754
numerischen Werten notwendig sind.</p></item>

</ulist>

</item>

<!-- ORIG
<item><p>The boolean false value is converted to the string
<code>false</code>.  The boolean true value is converted to the
string <code>true</code>.</p></item>
-->
<item><p>Der boolesche Wert <emph>falsch</emph> wird in die Zeichenkette
<code>false</code> konvertiert. Der boolesche Wert <emph>wahr</emph> wird in die 
Zeichenkette <code>true</code> konvertiert.</p></item>

<!-- ORIG
<item><p>An object of a type other than the four basic types is
converted to a string in a way that is dependent on that
type.</p></item>
-->
<item><p>Die Konvertierung eines Objekts von einem anderen Typ als den
vier Grundtypen hängt von diesem Typ ab.</p></item>

</ulist>

<!-- ORIG
<p>If the argument is omitted, it defaults to a node-set with the
context node as its only member.</p>
-->
<p>Wird kein Argument übergeben, wird stattdessen eine Knotenmenge mit
dem Kontextknoten als einzigem Element benutzt.</p>

<!-- ORIG
<note><p>The <code>string</code> function is not intended for
converting numbers into strings for presentation to users.  The
<code>format-number</code> function and <code>xsl:number</code>
element in <bibref ref="XSLT"/> provide this
functionality.</p></note>
-->
<note><p>Die Funktion <code>string</code> ist nicht dafür gedacht,
Zahlen in Zeichenketten zu konvertieren, die an Nutzer ausgegeben
werden. Die in <bibref ref="XSLT" /> definierte Funktion 
<code>format-number</code> und das ebenfalls dort definierte Element 
<code>xsl:number</code> stellen diese Funktionalität bereit.</p></note>

<proto name="concat" return-type="string"><arg type="string"/><arg type="string"/><arg occur="rep" type="string"/></proto>
<!-- ACHTUNG: occur="rep" widerspricht der DTD!!!!
     möglich nur "opt" und "req", was nun?? -->

<!-- ORIG
<p>The <function>concat</function> function returns the concatenation of its
arguments.</p>
-->
<p>Die Funktion <function>concat</function> liefert die Verkettung
ihrer Argumente.</p>

<proto name="starts-with" return-type="boolean"><arg type="string"/><arg type="string"/></proto>

<!-- ORIG
<p>The <function>starts-with</function> function returns true if the
first argument string starts with the second argument string, and
otherwise returns false.</p>
-->
<p>Die Funktion <function>starts-with</function> liefert den logischen
Wert <emph>wahr</emph>, falls die im ersten Argument übergebene 
Zeichenkette mit der im zweiten Argument übergebenen Zeichenkette 
beginnt, und andernfalls <emph>falsch</emph>.</p>

<!-- Errata ORIG
If the second argument string is the empty string, then true is
returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das zweite Argument die leere 
Zeichenkette ist, wird der Wert <emph>wahr</emph> 
zurückgegeben.</phrase>
</p>
</transnote>

<proto name="contains" return-type="boolean"><arg type="string"/><arg type="string"/></proto>

<!-- ORIG
<p>The <function>contains</function> function returns true if the first
argument string contains the second argument string, and otherwise
returns false.</p>
-->
<p>Die Funktion <function>contains</function> liefert den logischen
Wert <emph>wahr</emph>, falls die im ersten Argument übergebene 
Zeichenkette die im zweiten Argument übergebene Zeichenkette enthält, 
und andernfalls <emph>falsch</emph>.</p>

<!-- Errata ORIG
If the second argument string is the empty string, then true is 
returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das zweite Argument die leere 
Zeichenkette ist, wird der Wert <emph>wahr</emph> 
zurückgegeben.</phrase>
</p>
</transnote>

<proto name="substring-before" return-type="string"><arg type="string"/><arg type="string"/></proto>

<!-- ORIG
<p>The <function>substring-before</function> function returns the substring
of the first argument string that precedes the first occurrence of the
second argument string in the first argument string, or the empty
string if the first argument string does not contain the second
argument string.  For example,
<code>substring-before("1999/04/01","/")</code> returns
<code>1999</code>.</p>
-->
<p>Die Funktion <function>substring-before</function> liefert aus der 
im ersten Argument übergebenen Zeichenkette die Teilzeichenkette,
die vor dem ersten Auftreten der im zweiten Argument übergebenen 
Zeichenkette steht, bzw. die leere Zeichenkette, falls die erste
Zeichenkette nicht die zweite enthält. Zum Beispiel liefert
<code>substring-before("1999/04/01","/")</code> das Ergebnis
<code>1999</code>.</p>

<!-- Errata ORIG
If the second argument string is the empty string, then the empty 
string is returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das zweite Argument die leere 
Zeichenkette ist, wird die leere Zeichenkette zurückgegeben.</phrase>
</p>
</transnote>

<proto name="substring-after" return-type="string"><arg type="string"/><arg type="string"/></proto>

<!-- ORIG
<p>The <function>substring-after</function> function returns the
substring of the first argument string that follows the first
occurrence of the second argument string in the first argument string,
or the empty string if the first argument string does not contain the
second argument string. For example,
<code>substring-after("1999/04/01","/")</code> returns
<code>04/01</code>, and
<code>substring-after("1999/04/01","19")</code> returns
<code>99/04/01</code>.</p>
-->
<p>Die Funktion <function>substring-after</function> liefert aus der 
im ersten Argument übergebenen Zeichenkette die Teilzeichenkette,
die nach dem ersten Auftreten der im zweiten Argument übergebenen
Zeichenkette steht, bzw. die leere Zeichenkette, falls die erste
Zeichenkette nicht die zweite enthält. Zum Beispiel liefert
<code>substring-after("1999/04/01","/")</code> das Ergebnis
<code>04/01</code> und
<code>substring-after("1999/04/01","19")</code> liefert
<code>99/04/01</code>.</p>

<!-- Errata ORIG
If the second argument string is the empty string, then the first 
argument string is returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das zweite Argument die leere 
Zeichenkette ist, wird die im ersten Argument übergebene Zeichenkette 
zurückgegeben.</phrase>
</p>
</transnote>

<proto name="substring" return-type="string">
<arg type="string"/>
<arg type="number"/>
<arg type="number" occur="opt"/>
</proto>

<!-- ORIG
<p>The <function>substring</function> function returns the substring of the
first argument starting at the position specified in the second
argument with length specified in the third argument. For example,
<code>substring("12345",2,3)</code> returns <code>"234"</code>.
If the third argument is not specified, it returns
the substring starting at the position specified in the second
argument and continuing to the end of the string. For example,
<code>substring("12345",2)</code> returns <code>"2345"</code>.</p>
-->
<p>Die Funktion <function>substring</function> liefert aus der im 
ersten Argument übergebenen Zeichenkette die Teilzeichenkette,
die an der im zweiten Argument angegebenen Position beginnt und die
im dritten Argument angegebene Länge besitzt. Zum Beispiel liefert
<code>substring("12345",2,3)</code> das Ergebnis <code>"234"</code>.
Falls kein drittes Argument angegeben wird, liefert die Funktion die
Teilzeichenkette, die an der im zweiten Argument angegebenen Position
beginnt und bis zum Ende der Zeichenkette reicht. Zum Beispiel liefert
<code>substring("12345",2)</code> das Ergebnis <code>"2345"</code>.</p>

<!-- ORIG
<p>More precisely, each character in the string (see <specref
ref="strings"/>) is considered to have a numeric position: the
position of the first character is 1, the position of the second
character is 2 and so on.</p>
-->
<p>Genauer gesagt wird für jedes Zeichen der Zeichenkette (siehe 
<specref ref="strings" />) eine numerische Position angenommen: die
Position des ersten Zeichens ist 1, die Position des zweiten Zeichens 
ist 2 usw.</p>

<!-- ORIG
<note><p>This differs from Java and ECMAScript, in which the
<code>String.substring</code> method treats the position of the first
character as 0.</p></note>
-->
<note><p>Dies unterscheidet sich von Java und ECMAScript, in denen die
Methode <code>String.substring</code> die Position des ersten Zeichens
mit 0 definiert.</p></note>

<!-- ORIG
<p>The returned substring contains those
characters for which the position of the character is greater than or
equal to the rounded value of the second argument and, if the third
argument is specified, less than the sum of the rounded value of the
second argument and the rounded value of the third argument; the
comparisons and addition used for the above follow the standard IEEE
754 rules; rounding is done as if by a call to the
<function>round</function> function. The following examples illustrate
various unusual cases:</p>
-->
<p>Die zurückgegebene Teilzeichenkette enthält die Zeichen, deren
Position größer oder gleich dem gerundeten Wert des zweiten Arguments
ist und, falls ein drittes Argument übergeben wurde, kleiner als die
Summe des gerundeten Wertes des zweiten und des gerundeten Wertes des
dritten Arguments. Vergleich und Addition folgen den Standardregeln
von IEEE 754; die Rundung erfolgt wie durch die Funktion
<function>round</function>. Die folgenden Beispiele illustrieren
einige unübliche Fälle:</p>

<ulist>

<!-- ORIG
<item><p><code>substring("12345", 1.5, 2.6)</code> returns
<code>"234"</code></p></item>
-->
<item><p><code>substring("12345", 1.5, 2.6)</code> liefert
<code>"234"</code></p></item>

<!-- ORIG
<item><p><code>substring("12345", 0, 3)</code> returns
<code>"12"</code></p></item>
-->
<item><p><code>substring("12345", 0, 3)</code> liefert
<code>"12"</code></p></item>

<!-- ORIG
<item><p><code>substring("12345", 0 div 0, 3)</code> returns
<code>""</code></p></item>
-->
<item><p><code>substring("12345", 0 div 0, 3)</code> liefert
<code>""</code></p></item>

<!-- ORIG
<item><p><code>substring("12345", 1, 0 div 0)</code> returns
<code>""</code></p></item>
-->
<item><p><code>substring("12345", 1, 0 div 0)</code> liefert
<code>""</code></p></item>

<!-- ORIG
<item><p><code>substring("12345", -42, 1 div 0)</code> returns
<code>"12345"</code></p></item>
-->
<item><p><code>substring("12345", -42, 1 div 0)</code> liefert
<code>"12345"</code></p></item>

<!-- ORIG
<item><p><code>substring("12345", -1 div 0, 1 div 0)</code> returns
<code>""</code></p></item>
-->
<item><p><code>substring("12345", -1 div 0, 1 div 0)</code> liefert
<code>""</code></p></item>

</ulist>

<transnote>
<p>
Die letzten vier Beispiele werden plausibel, wenn man die Definition 
für <function>substring</function> wortgetreu anwendet und beachtet, 
dass ein Vergleich mit dem Wert NaN immer <emph>falsch</emph> sowie 
jede Gleitkommazahl kleiner als positiv unendlich ist.
</p><p>
Mit Hilfe eines ähnlich gearteten Aufrufs dieser Funktion können 
bedingte Ausdrücke für Zeichenketten und damit auch Zahlen simuliert 
werden. Ein bedingter Ausdruck liefert abhängig von der Auswertung 
eines logischen Ausdrucks einen von zwei möglichen vorgegebenen Werten.
Für Knotenmengen wurde die analoge Funktionalität im Zusammenhang mit
dem Vereinigungsoperator <code>|</code> bereits in Kapitel
<specref ref="node-sets" /> vorgestellt.
</p><p>
Unter Ausnutzung der Tatsache, dass ein logischer Wert <emph>wahr</emph>
nach 1 und ein logischer Wert <emph>falsch</emph> nach 0 konvertiert 
wird (siehe Regeln bei der Funktion <function>number</function>), 
ergibt der Ausdruck
</p>
<eg>substring(<emph>string</emph>, 1 div <emph>boolean-test</emph>)</eg>
<p>
den Wert <emph><code>string</code></emph>, 
falls <emph><code>boolean-test</code></emph> <emph>wahr</emph> ist,
und ansonsten die leere Zeichenkette. Die vollständige Formulierung
eines bedingten Ausdrucks sieht damit folgendermaßen aus:
</p>
<eg>
concat(substring(<emph>true-string</emph>, 1 div <emph>boolean-test</emph>),
       substring(<emph>false-string</emph>, 1 div not(<emph>boolean-test</emph>)))
</eg>
<p>
Solche Ausdrücke können beim Sortieren in XSLT eingesetzt werden, wenn 
der zu benutzende Sortierschlüssel von einer aktuell auszuwertenden 
Bedingung abhängt. Allerdings werden sie bei komplexeren Bedingungen
schnell unübersichtlich.
</p>
</transnote>

<proto name="string-length" return-type="number">
<arg type="string" occur="opt"/>
</proto>

<!-- ORIG
<p>The <function>string-length</function> returns the number of
characters in the string (see <specref ref="strings"/>).  If the
argument is omitted, it defaults to the context node converted to a
string, in other words the <termref
def="dt-string-value">string-value</termref> of the context node.</p>
-->
<p>Die Funktion <function>string-length</function> liefert die Anzahl
der Zeichen der Zeichenkette (siehe <specref ref="strings"/>). Falls
kein Argument übergeben wurde, wird der in eine Zeichenkette 
konvertierte Kontextknoten angenommen, mit anderen Worten der <termref
def="dt-string-value">Zeichenkettenwert</termref> des 
Kontextknotens.</p>

<transnote>
<p>
Es gibt in XPath keine Funktion <code>ends-with</code>, die analog zu
<function>starts-with</function> bestimmt, ob eine Zeichenkette mit 
einer anderen endet. Mit Hilfe der Funktionen 
<function>substring</function> und <function>string-length</function> 
kann diese Funktionalität jedoch nachgebildet werden.
<code>ends-with($str1, $str2)</code>
würde den Wert <emph>wahr</emph> liefern, falls gilt:
</p>
<eg>$str2 = substring($str1, string-length($str1) - string-length($str2) + 1)</eg>
<p>
Für das Auffüllen einer Zeichenkette von links mit Leerzeichen (z.B.
für eine rechtsbündige Textausgabe) erweisen sich die Funktionen 
<function>concat</function>, <function>substring</function> und 
<function>string-length</function> sowie eine ausreichend lange, 
ausschließlich aus Leerzeichen bestehende Zeichenkette als gute Helfer:
</p>
<eg>
concat(substring("                                             ",
                 1, $width - string-length($eingabe)), $eingabe)
</eg>
</transnote>

<proto name="normalize-space" return-type="string"><arg occur="opt" type="string"/></proto>

<!-- ORIG
<p>The <function>normalize-space</function> function returns the argument
string with whitespace normalized by stripping leading and trailing
whitespace and replacing sequences of whitespace characters by a
single space.  Whitespace characters are the same as those allowed by the <xnt
href="&XML;#NT-S">S</xnt> production in XML.  If the argument is
omitted, it defaults to the context node converted to a string, in
other words the <termref def="dt-string-value">string-value</termref>
of the context node.</p>
-->
<p>Die Funktion <function>normalize-space</function> liefert als
Ergebnis die übergebene Zeichenkette mit normalisiertem Leerraum zurück,
d.h. führender und abschließender Leerraum werden entfernt, Folgen von
mehreren Leerraumzeichen werden durch ein einzelnes Leerzeichen 
ersetzt. Leerraumzeichen sind jene, die durch die Produktion <xnt
href="&XML;#NT-S">S</xnt> in XML definiert sind. Falls
kein Argument übergeben wurde, wird der in eine Zeichenkette 
konvertierte Kontextknoten angenommen, mit anderen Worten der <termref
def="dt-string-value">Zeichenkettenwert</termref> des 
Kontextknotens.</p>

<transnote>
<p>
Diese Funktion verarbeitet eine übergebene Zeichenkette in der
gleichen Weise, wie ein XML-Prozessor nach Ersetzung aller Referenzen
Nicht-CDATA-Attribute behandelt, siehe Kapitel 3.3.3 in
<bibref ref="XML-2" />.
</p>
<p>
Zur Erläuterung sei das folgende Beispiel angegeben. Häufig finden sich
in XML-Dokumenten Textdaten, die folgendermaßen ausgezeichnet sind:
</p>
<eg><![CDATA[
<name>
   Otto Normal
</name>
]]></eg>
<p>
Der Zeichenkettenwert des Elements <code>name</code> enthält neben der
wichtigen Information über <code>Otto Normal</code> auch alle 
Leerraumzeichen, also den Zeilenumbruch nach dem Start-Tag 
<code>&lt;name&gt;</code>, die Leerzeichen vor <code>Otto</code> und 
den Zeilenumbruch inklusive eventueller Leerzeichen vor dem 
schließenden End-Tag. Ein Vergleich für den Kontextknoten 
<code>name</code>
</p>
<eg>.="Otto Normal"</eg>
<p>
liefert also nicht das erhoffte Ergebnis, sondern schlägt fehl. Korrekt
ist in diesem Fall stattdessen ein Vergleich mit dem normalisierten 
Wert des Knotens:
</p>
<eg>normalize-space()="Otto Normal"</eg>
<p>
Am Beispiel <function>normalize-space</function> soll an dieser Stelle
vor einer Falle gewarnt werden, in die man bei der Übergabe von 
Knotenmengen an Funktionen mit skalaren Parametertypen leicht geraten
kann. Angenommen, der Name <code>Otto Normal</code> kommt mehrfach vor
und man möchte nur den ersten dieser <code>name</code>-Knoten 
bearbeiten. In diesem Fall kann man z.B. verlangen, dass keiner der 
Vorgänger den gleichen Namen hat. Ist eine Normalisierung nicht 
erforderlich, lautet der Test einfach:
</p>
<eg>.="Otto Normal" and not(preceding-sibling::name="Otto Normal")</eg>
<p>
Muss man aber normalisieren, erweist sich der folgende Test als
ungeeignet:
</p>
<eg>
normalize-space()="Otto Normal" and
not(normalize-space(preceding-sibling::name)="Otto Normal")
</eg>
<p>
Da die Funktion <function>normalize-space</function> als Argument eine 
Zeichenkette erwartet, wird die übergebene Knotenmenge mit der Funktion
<function>string</function> konvertiert. Es wird also letztlich nur der
erste Knoten (bezüglich der
<termref def="dt-document-order">Dokumentordnung</termref>) der
übergebenen Knotenmenge durch <function>normalize-space</function>
ausgewertet und damit nur getestet, ob der erste
<code>name</code>-Knoten einen von »<code>Otto Normal</code>«
verschiedenen normalisierten 
<termref def="dt-string-value">Zeichenkettenwert</termref>
besitzt. Die Lösung besteht in solchen Fällen darin, den Test in ein
Prädikat zu verschieben:
</p>
<eg>
normalize-space()="Otto Normal" and
not(preceding-sibling::name[normalize-space()="Otto Normal"])
</eg>
</transnote>

<proto name="translate" return-type="string"><arg type="string"/><arg type="string"/><arg type="string"/></proto>

<!-- ORIG
<p>The <function>translate</function> function returns the first
argument string with occurrences of characters in the second argument
string replaced by the character at the corresponding position in the
third argument string.  For example,
<code>translate("bar","abc","ABC")</code> returns the string
<code>BAr</code>.  If there is a character in the second argument
string with no character at a corresponding position in the third
argument string (because the second argument string is longer than the
third argument string), then occurrences of that character in the
first argument string are removed.  For example,
<code>translate("..aaa..","abc.","ABC")</code> returns
<code>"AAA"</code>. If a character occurs more than once in the second
argument string, then the first occurrence determines the replacement
character.  If the third argument string is longer than the second
argument string, then excess characters are ignored.</p>
-->
<p>Die Funktion <function>translate</function> liefert als Ergebnis
die im ersten Argument übergebene Zeichenkette, wobei jedes Vorkommen
eines Zeichens aus der im zweiten Argument übergebenen Zeichenkette 
ersetzt wird durch das Zeichen an der korrespondierenden Position aus
der im dritten Argument übergebenen Zeichenkette. Zum Beispiel liefert
<code>translate("bar","abc","ABC")</code> die Zeichenkette
<code>BAr</code>. Wenn es im zweiten Argument ein Zeichen gibt, für das
kein korrespondierendes Zeichen im dritten Argument existiert (weil
das zweite Argument länger ist als das dritte), so werden alle 
Vorkommen dieses Zeichens im ersten Argument entfernt. Zum Beispiel
liefert <code>translate("--aaa--","abc-","ABC")</code> das Ergebnis
<code>"AAA"</code>. Falls ein Zeichen mehrmals im zweiten Argument
vorkommt, bestimmt das erste Auftreten das Ersetzungszeichen. Falls
die im dritten Argument übergebene Zeichenkette länger ist als die
zweite, werden überzählige Zeichen ignoriert.</p>

<!-- ORIG
<note><p>The <function>translate</function> function is not a sufficient
solution for case conversion in all languages.  A future version of
XPath may provide additional functions for case conversion.</p></note>
-->
<note><p>Die Funktion <function>translate</function> ist keine
ausreichende Lösung für die Umwandlung zwischen Groß- und
Kleinschreibung in allen Sprachen.
Eine zukünftige Version von XPath kann zusätzliche Funktionen für
diese Umwandlung zur Verfügung stellen.</p></note>
<transnote>
<p>
Für deutsche Umlaute reicht sie im Allgemeinen aus. Möchte man 
in einem Stylesheet an mehreren Stellen Klein- in Großschreibung
umwandeln, bietet es sich an, geeignete Variablen zu definieren und 
fortan diese zu benutzen.
</p><p>
In XSLT sähe das folgendermaßen aus:
</p>
<eg><![CDATA[
<xsl:variable name="upper-case" 
              select="'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ'" />
<xsl:variable name="lower-case"
              select="'abcdefghijklmnopqrstuvwxyzäöü'" />

...
<xsl:if test="translate(firma, $lower-case, $upper-case) = 'XYZ GMBH'">
   ...
</xsl:if>
]]></eg>
<p>
Allerdings stößt man schon beim Buchstaben »ß« an die Grenzen der
Funktion <function>translate</function>. Die Ersetzung von »ß« durch
die beiden Buchstaben »SS« ist auf diese Weise nicht möglich, weil 
der Ersetzungstext länger als ein Zeichen ist.
</p><p>
Allgemein gilt, dass die Funktion 
<function>translate</function> kein Mittel zum Ersetzen von beliebigen
Teilzeichenketten ist. Ein einmaliges Ersetzen im Sinne von
<code>replace($string, $from, $to)</code>
kann durch
</p>
<eg>
concat(substring-before($string, $from), $to,
       substring-after($string, $from))
</eg>
<p>
ausgedrückt werden. XPath 1.0 stellt keine Mittel bereit, alle Vorkommen
von <code>$from</code> in <code>$string</code> durch <code>$to</code>
zu ersetzen. Dies wird sich in einer zukünftigen XPath-Version ändern 
<bibref ref="XPATHOP" />.
</p><p>
Mit der Funktion <function>translate</function> lassen sich
darüber hinaus sehr einfach ausgewählte Zeichen aus einer Zeichenkette
entfernen, indem als drittes Argument eine leere Zeichenkette übergeben
wird. Dies kann beispielsweise für den Test genutzt werden, ob eine 
Zeichenkette <code>$string</code> nur die in <code>$allowed-char</code>
aufgezählten Zeichen enthält:
</p>
<eg>translate($string, $allowed-char, "") = ""</eg>
</transnote>

</div2>


<div2>
<!-- ORIG
<head>Boolean Functions</head>
-->
<head>Boolesche Funktionen</head>

<proto name="boolean" return-type="boolean"><arg type="object"/></proto>

<!-- ORIG
<p>The <function>boolean</function> function converts its argument to a
boolean as follows:</p>
-->
<p>Die Funktion <function>boolean</function> konvertiert ihr Argument
wie folgt in einen Boolean-Wert:</p>

<ulist>

<!-- ORIG
<item><p>a number is true if and only if it is neither positive or
negative zero nor NaN</p></item>
-->
<item><p>Eine Zahl ergibt den Wert <emph>wahr</emph> genau dann, wenn 
sie weder positiv oder negativ Null noch NaN ist.</p></item>

<!-- ORIG
<item><p>a node-set is true if and only if it is non-empty</p></item>
-->
<item><p>Eine Knotenmenge ergibt den Wert <emph>wahr</emph> genau dann,
wenn sie nicht leer ist.</p>
<transnote>
<p>
Aus diesem Grund lässt sich ein Test auf das Vorhandensein von
Knoten sehr kompakt aufschreiben: <code>img[@alt]</code> bedeutet 
dasselbe wie <code>img[boolean(@alt)]</code>. Gesucht ist damit ein 
<code>img</code>-Element, das ein <code>alt</code>-Attribut besitzt.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>a string is true if and only if its length is non-zero</p></item>
-->
<item><p>Eine Zeichenkette ergibt genau dann den Wert <emph>wahr</emph>,
wenn ihre Länge ungleich Null ist.</p>
<transnote>
<p>
Zum Vergleich mit dem letzten Beispiel:
<code>img[string(@alt)]</code> steht abkürzend für
<code>img[boolean(string(@alt))]</code> und bedeutet jetzt, dass ein
<code>img</code>-Element gesucht wird, dessen
<code>alt</code>-Attribut einen nichtleeren 
<termref def="dt-string-value">Zeichenkettenwert</termref> besitzt.
Für <code><![CDATA[<img alt="" ... />]]></code> wäre der erste Test
erfüllt, der zweite jedoch nicht.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>an object of a type other than the four basic types is
converted to a boolean in a way that is dependent on that
type</p></item>
-->
<item><p>Die Konvertierung eines Objekts von einem anderen Typ als den
vier Grundtypen hängt von diesem Typ ab.</p></item>

</ulist>

<transnote>
<p>
Während das Argument der Funktionen <function>string</function> und 
<function>number</function> optional ist, beim Fehlen damit der 
Kontextknoten angenommen wird, ist das Argument für die Funktion 
<function>boolean</function> obligatorisch. Eine analoge Definition, 
die gegebenenfalls auf den Kontextknoten zurückgreift, hätte auch nicht 
viel Sinn, da in diesem Fall die Funktion <function>boolean</function> 
den Wert <emph>wahr</emph> liefern müsste &ndash; der Kontextknoten ist
schließlich immer vorhanden.
</p>
</transnote>


<proto name="not" return-type="boolean"><arg type="boolean"/></proto>

<!-- ORIG
<p>The <function>not</function> function returns true if its argument is
false, and false otherwise.</p>
-->
<p>Die Funktion <function>not</function> liefert den Wert 
<emph>wahr</emph>, wenn ihr Argument <emph>falsch</emph> ist, und 
ansonsten <emph>falsch</emph>.</p>

<transnote>
<p>
Im Unterschied zu den Operatoren <code>and</code> und <code>or</code>, 
die in den Produktionen <nt def="NT-OrExpr">OrExpr</nt> bzw. 
<nt def="NT-AndExpr">AndExpr</nt> definiert werden, handelt es sich bei
<function>not</function> um eine Funktion.
</p>
</transnote>

<proto name="true" return-type="boolean"></proto>

<!-- ORIG
<p>The <function>true</function> function returns true.</p>
-->
<p>Die Funktion <function>true</function> liefert den Wert 
<emph>wahr</emph>.</p>

<proto name="false" return-type="boolean"></proto>

<!-- ORIG
<p>The <function>false</function> function returns false.</p>
-->
<p>Die Funktion <function>false</function> liefert den Wert 
<emph>falsch</emph>.</p>
<transnote>
<p>
XPath definiert keine Literale für <emph>wahr</emph> und 
<emph>falsch</emph>. Soll ein boolescher Wert als Parameter an eine 
Funktion oder ein benanntes XSLT-Template übergeben werden, muss dafür 
eine der Funktionen <function>true</function> oder 
<function>false</function> benutzt werden.
</p>
</transnote>

<proto name="lang" return-type="boolean"><arg type="string"/></proto>

<!-- ORIG
<p>The <function>lang</function> function returns true or false depending on
whether the language of the context node as specified by
<code>xml:lang</code> attributes is the same as or is a sublanguage of
the language specified by the argument string.  The language of the
context node is determined by the value of the <code>xml:lang</code>
attribute on the context node, or, if the context node has no
<code>xml:lang</code> attribute, by the value of the
<code>xml:lang</code> attribute on the nearest ancestor of the context
node that has an <code>xml:lang</code> attribute.  If there is no such
attribute, then <function>lang</function> returns false. If there is such an
attribute, then <function>lang</function> returns true if the attribute
value is equal to the argument ignoring case, or if there is some
suffix starting with <code>-</code> such that the attribute value is
equal to the argument ignoring that suffix of the attribute value and
ignoring case. For example, <code>lang("en")</code> would return true
if the context node is any of these five elements:</p>
-->
<p>Die Funktion <function>lang</function> liefert einen Wert 
<emph>wahr</emph> oder <emph>falsch</emph> in Abhängigkeit davon, ob
die durch <code>xml:lang</code>-Attribute angegebene Sprache des 
Kontextknotens die gleiche oder eine Untersprache der im Argument 
übergebenen Zeichenkette ist. Die Sprache des Kontextknotens wird durch
den Wert des Attributes <code>xml:lang</code> des Kontextknotens 
bestimmt oder, wenn der Kontextknoten kein Attribut 
<code>xml:lang</code> besitzt, durch den Wert des Attributes 
<code>xml:lang</code> beim nächsten Vorfahren des Kontextknotens, der 
ein Attribut <code>xml:lang</code> besitzt. Wenn es kein solches 
Attribut gibt, liefert <function>lang</function> den Wert 
<emph>falsch</emph>. Wenn es ein solches Attribut gibt, liefert 
<function>lang</function> den Wert <emph>wahr</emph>, wenn
der Attributwert gleich dem Argument ist, unabhängig von der
Groß- oder Kleinschreibung, oder wenn es ein mit <code>-</code>
beginnendes Suffix derart gibt, dass der Attributwert gleich dem
Argument ohne dieses Suffix ist, unabhängig von der Groß- oder
Kleinschreibung. Beispielsweise würde <code>lang("en")</code> den
Wert <emph>wahr</emph> liefern, wenn es sich beim Kontextknoten um 
eines dieser fünf Elemente handelt:</p>

<eg><![CDATA[<para xml:lang="en"/>
<div xml:lang="en"><para/></div>
<para xml:lang="EN"/>
<para xml:lang="en-us"/>]]></eg>
<transnote>
<p>
Handelt es sich beim Kontextknoten dagegen um das
<code>para</code>-Element im Beispiel
</p>
<eg><![CDATA[
<div xml:lang="en"><sect xml:lang="de"><para/></sect></div>]]></eg>
<p>
liefert <code>lang("en")</code> den Wert <emph>falsch</emph>. Der 
nächste Vorfahre mit einem <code>xml:lang</code>-Attribut ist in diesem 
Fall das Element <code>sect</code>, in welchem die Sprache auf 
<code>de</code> gesetzt wird.
</p><p>
Das Verhalten der Funktion <function>lang</function> darf nicht mit 
einem impliziten Vorhandensein des Attributs <code>xml:lang</code>
verwechselt werden. Für das obige Beispiel liefert 
<code>//para[@xml:lang='de']</code> eine leere Knotenmenge, während 
<code>//para[lang('de')]</code> das <code>para</code>-Element auswählt.
</p>
</transnote>

</div2>

<div2>
<!-- ORIG
<head>Number Functions</head>
-->
<head>Zahlenfunktionen</head>

<proto name="number" return-type="number"><arg occur="opt" type="object"/></proto>

<!-- ORIG
<p>The <function>number</function> function converts its argument to a
number as follows:</p>
-->
<p>Die Funktion <function>number</function> konvertiert ihr Argument
wie folgt in eine Zahl:</p>

<ulist>

<!-- followed by *optional* whitespace -->
<!-- ORIG
<item><p>a string that consists of optional whitespace followed by an
optional minus sign followed by a <nt def="NT-Number">Number</nt>
followed by whitespace is converted to the IEEE 754 number that is
nearest (according to the IEEE 754 round-to-nearest rule)
to the mathematical value represented by the string; any other
string is converted to NaN</p></item>
-->
<item><p>Eine Zeichenkette, die aus optionalem Leerraum besteht, 
gefolgt von einem optionalen Minuszeichen, gefolgt von einer
<nt def="NT-Number">Number</nt>, gefolgt von Leerraum, wird in eine
IEEE-754-Zahl konvertiert, die (entsprechend den Rundungsregeln in 
IEEE 754) dem mathematischen Wert am nächsten ist, der durch
die Zeichenkette repräsentiert wird. Jede andere Zeichenkette wird in
NaN konvertiert.</p></item>

<!-- ORIG
<item><p>boolean true is converted to 1; boolean false is converted to
0</p></item>
-->
<item><p>Der boolesche Wert <emph>wahr</emph> wird in 1 konvertiert; 
der boolesche Wert <emph>falsch</emph> wird in 0 konvertiert.</p></item>

<item>

<!-- ORIG
<p>a node-set is first converted to a string as if by a call to the
<function>string</function> function and then converted in the same way as a
string argument</p>
-->
<p>Eine Knotenmenge wird zunächst wie beim Aufruf der Funktion 
<function>string</function> in eine Zeichenkette konvertiert und 
anschließend in der gleichen Weise wie eine Zeichenkette 
konvertiert.</p>

</item>

<!-- ORIG
<item><p>an object of a type other than the four basic types is
converted to a number in a way that is dependent on that
type</p></item>
-->
<item><p>Die Konvertierung eines Objekts von einem anderen Typ als den
vier Grundtypen hängt von diesem Typ ab.</p></item>

</ulist>

<!-- ORIG
<p>If the argument is omitted, it defaults to a node-set with the
context node as its only member.</p>
-->
<p>Wird kein Argument übergeben, wird stattdessen eine Knotenmenge mit
dem Kontextknoten als einzigem Element benutzt.</p>

<!-- ORIG
<note><p>The <function>number</function> function should not be used
for conversion of numeric data occurring in an element in an XML
document unless the element is of a type that represents numeric data
in a language-neutral format (which would typically be transformed
into a language-specific format for presentation to a user). In
addition, the <function>number</function> function cannot be used
unless the language-neutral format used by the element is consistent
with the XPath syntax for a <nt
def="NT-Number">Number</nt>.</p></note>
-->
<note><p>Die Funktion <function>number</function> sollte nicht für
die Konvertierung numerischer Daten in einem Element eines 
XML-Dokuments benutzt werden, es sei denn, das Element ist von einem 
Typ, der numerische Daten in einem sprachunabhängigen Format 
repräsentiert (das typischerweise für die Präsentation für einen 
Anwender in ein sprachspezifisches Format umgewandelt würde).
Darüber hinaus kann die Funktion <function>number</function> nur
genutzt werden, wenn das von dem Element genutzte sprachunabhängige
Format mit der XPath-Syntax für <nt def="NT-Number">Number</nt>
konsistent ist.</p></note>

<transnote>
<p>
Insbesondere eignet sich eine Zahl im hiesigen Format (der Punkt zur 
Kennzeichnung der Tausenderstellen, das Komma zur Abgrenzung von den 
Dezimalstellen) nicht als Argument für die Funktion 
<function>number</function>. Der Aufruf von 
<code>number('12.000,50')</code> liefert beispielsweise den Wert NaN.
Eine Umwandlung in das Format für <nt def="NT-Number">Number</nt>
kann in diesem Fall mit Hilfe der Funktion 
<function>translate</function> vorgenommen werden:
<code>number(translate('12.000,50', ',.', '.'))</code>.
</p>
</transnote>

<proto name="sum" return-type="number"><arg type="node-set"/></proto>

<!-- ORIG
<p>The <function>sum</function> function returns the sum, for each
node in the argument node-set, of the result of converting the
<termref def="dt-string-value">string-value</termref>s of the node to
a number.</p>
-->
<p>Die Funktion <function>sum</function> liefert die Summe aller in
eine Zahl konvertierten 
<termref def="dt-string-value">Zeichenkettenwerte</termref> der
Knoten aus der Argumentknotenmenge.</p>

<transnote>
<p>
Sie eignet sich damit nur für Fälle, in denen die zu summierenden Werte
direkt in der XML-Quelle vorliegen. Sollen die Summanden komplexer 
sein, d.h. jeweils durch einen eigenen Ausdruck berechnet werden, kann 
die Funktion <function>sum</function> nicht mehr benutzt werden. 
XPath nutzende Implementationen können aber eigene Sprachmittel
bereitstellen, mit denen solche Berechnungen durchgeführt werden
können.
</p><p>
Die Funktion <function>sum</function> hilft noch in einem anderen 
Anwendungsfall: Aus der Definition des Verhaltens von 
<function>number</function> geht hervor, dass letztere eine leere 
Knotenmenge in den Wert NaN konvertiert. Ein Ausdruck 
<code>foo - bar</code> liefert damit NaN, falls wenigstens eines der 
Elemente <code>foo</code> oder <code>bar</code> nicht existiert. 
Möchte man stattdessen, dass in diesem Fall die Zahl 0 für 
nicht existierende Elemente angenommen wird, kann man dies über den 
Ausdruck <code>sum(foo[1]) - sum(bar[1])</code> erreichen.
</p>
</transnote>

<proto name="floor" return-type="number"><arg type="number"/></proto>

<!-- ORIG
<p>The <function>floor</function> function returns the largest (closest to
positive infinity) number that is not greater than the argument and
that is an integer.</p>
-->
<p>Die Funktion <function>floor</function> liefert die größte Zahl
(die am nächsten an positiv unendlich liegt), die nicht größer als das
Argument und ganzzahlig ist.</p>

<!-- Errata ORIG
If the argument is NaN, then NaN is returned. If the argument is 
positive infinity, then positive infinity is returned. If the argument 
is negative infinity, then negative infinity is returned. If the
argument is positive zero, then positive zero is returned. If the 
argument is negative zero, then negative zero is returned. If the 
argument is greater than zero, but less than 1, then positive zero is 
returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Absatz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das Argument NaN ist, wird NaN 
zurückgegeben.
Wenn das Argument positiv unendlich ist, wird positiv unendlich 
zurückgegeben.
Wenn das Argument negativ unendlich ist, wird negativ unendlich 
zurückgegeben.
Wenn das Argument positiv Null ist, wird positiv Null zurückgegeben.
Wenn das Argument negativ Null ist, wird negativ Null zurückgegeben.
Wenn das Argument größer als Null, aber kleiner als 1 ist, wird
positiv Null zurückgegeben.</phrase>
</p>
</transnote>

<proto name="ceiling" return-type="number"><arg type="number"/></proto>

<!-- ORIG
<p>The <function>ceiling</function> function returns the smallest (closest
to negative infinity) number that is not less than the argument and
that is an integer.</p>
-->
<p>Die Funktion <function>ceiling</function> liefert die kleinste Zahl
(die am nächsten an negativ unendlich liegt), die nicht kleiner als das
Argument und ganzzahlig ist.</p>

<!-- Errata ORIG
If the argument is NaN, then NaN is returned. If the argument is 
positive infinity, then positive infinity is returned. If the argument 
is negative infinity, then negative infinity is returned. If the 
argument is positive zero, then positive zero is returned. If the 
argument is negative zero, then negative zero is returned. If the 
argument is less than zero, but greater than -1, then negative zero is 
returned.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Absatz ergänzt werden:
</p><p>
<phrase role="errata" diff="chg">Wenn das Argument NaN ist, wird NaN 
zurückgegeben.
Wenn das Argument positiv unendlich ist, wird positiv unendlich 
zurückgegeben.
Wenn das Argument negativ unendlich ist, wird negativ unendlich 
zurückgegeben.
Wenn das Argument positiv Null ist, wird positiv Null zurückgegeben.
Wenn das Argument negativ Null ist, wird negativ Null zurückgegeben.
Wenn das Argument kleiner als Null, aber größer als -1 ist, wird
positiv Null zurückgegeben.</phrase>
</p>
</transnote>

<proto name="round" return-type="number"><arg type="number"/></proto>

<!-- ORIG
<p>The <function>round</function> function returns the number that is
closest to the argument and that is an integer.  If there are two such
numbers, then the one that is closest to positive infinity is
returned. If the argument is NaN, then NaN is returned. If the
argument is positive infinity, then positive infinity is returned.  If
the argument is negative infinity, then negative infinity is
returned. If the argument is positive zero, then positive zero is
returned.  If the argument is negative zero, then negative zero is
returned.  If the argument is less than zero, but greater than or
equal to -0.5, then negative zero is returned.</p>
-->

<p>Die Funktion <function>round</function> liefert die Zahl, die am
nächsten am Argument liegt und die ganzzahlig ist. Wenn es zwei solche
Zahlen gibt, wird die Zahl geliefert, die näher an positiv
unendlich liegt. 
Ist das Argument NaN, wird NaN zurückgegeben. 
Ist das Argument positiv unendlich, wird positiv unendlich zurückgegeben.
Ist das Argument negativ unendlich, wird negativ unendlich zurückgegeben.
Ist das Argument positiv Null, wird positiv Null zurückgegeben.
Ist das Argument negativ Null, wird negativ Null zurückgegeben.
Ist das Argument kleiner als Null, aber größer oder gleich -0.5,
wird negativ Null zurückgegeben.</p>

<!-- ORIG
<note><p>For these last two cases, the result of calling the
<function>round</function> function is not the same as the result of
adding 0.5 and then calling the <function>floor</function>
function.</p></note>
-->
<note><p>In den letzten beiden Fällen ist das Ergebnis des Aufrufs
der Funktion <function>round</function> verschieden von der
Addition von 0.5 und dem Aufruf der Funktion 
<function>floor</function>.</p></note>

<transnote>
<p>
Davon kann man sich leicht selbst überzeugen:
</p><p>
Für -0 ergibt sich: <code>floor(-0 + 0.5) = floor(0.5) = 0</code> 
(positiv Null)
</p><p>
Für -0.5 ergibt sich: <code>floor(-0.5 + 0.5) = floor(0) = 0</code> 
(positiv Null)
</p>
</transnote>

</div2>

</div1>

<div1 id="data-model">
<!-- ORIG
<head>Data Model</head>
-->
<head>Datenmodell</head>

<!-- ORIG
<p>XPath operates on an XML document as a tree. This section describes
how XPath models an XML document as a tree.  This model is conceptual
only and does not mandate any particular implementation.  The
relationship of this model to the XML Information Set <bibref
ref="XINFO"/> is described in <specref ref="infoset"/>.</p>
-->
<p>XPath operiert auf der Baumrepräsentation eines XML-Dokuments.
Das folgende Kapitel beschreibt, wie XPath ein XML-Dokument als Baum
modelliert. Dieses Modell ist rein konzeptionell und schreibt keinerlei
spezielle Implementation vor. Die Beziehung zwischen diesem Modell und 
der XML-Informationsmenge <bibref ref="XINFO" /> wird in <specref 
ref="infoset" /> beschrieben.</p>

<!-- ORIG
<p>XML documents operated on by XPath must conform to the XML
Namespaces Recommendation <bibref ref="XMLNAMES"/>.</p>
-->
<p>Die durch XPath verarbeiteten XML-Dokumente müssen sich nach der
XML-Namensraum-Empfehlung <bibref ref="XMLNAMES" /> richten.</p>

<transnote>
<p>
Insbesondere dürfen Namen von Elementen und Attributen das Zeichen 
»<code>:</code>« nur als Separator zwischen Namensraum-Präfix und 
lokalem Namen enthalten. Außerdem muss jedes benutzte Präfix deklariert
worden sein. XML-Dokumente, die den Doppelpunkt nicht 
Namensraum-konform verwenden, können durch XPath-Implementationen nicht
verarbeitet werden.
</p>
</transnote>

<!-- ORIG
<p>The tree contains nodes.  There are seven types of node:</p>
-->
<p>Der Baum enthält Knoten. Es gibt sieben Typen von Knoten:</p>

<ulist>

<!-- ORIG
<item><p>root nodes</p></item>
-->
<item><p>Wurzelknoten</p></item>

<!-- ORIG
<item><p>element nodes</p></item>
-->
<item><p>Elementknoten</p></item>

<!-- ORIG
<item><p>text nodes</p></item>
-->
<item><p>Textknoten</p></item>

<!-- ORIG
<item><p>attribute nodes</p></item>
-->
<item><p>Attributknoten</p></item>

<!-- ORIG
<item><p>namespace nodes</p></item>
-->
<item><p>Namensraumknoten</p></item>

<!-- ORIG
<item><p>processing instruction nodes</p></item>
-->
<item><p>Processing-Instruction-Knoten</p></item>

<!-- ORIG
<item><p>comment nodes</p></item>
-->
<item><p>Kommentarknoten</p></item>

</ulist>

<!-- ORIG
<p><termdef term="String Value" id="dt-string-value">For every type of
node, there is a way of determining a <term>string-value</term> for a
node of that type.  For some types of node, the string-value is part
of the node; for other types of node, the string-value is computed
from the string-value of descendant nodes.</termdef></p>
-->
<p><termdef term="Zeichenkettenwert" id="dt-string-value">Für jeden
Knotentyp gibt es einen Weg, den <term>Zeichenkettenwert</term> eines
Knotens dieses Typs zu bestimmen. Bei einigen Knotentypen ist der
Zeichenkettenwert Teil des Knotens, bei anderen Knotentypen wird der
Zeichenkettenwert aus den Zeichenkettenwerten der Nachkommen 
berechnet.</termdef></p>

<!-- ORIG
<note><p>For element nodes and root nodes, the string-value of a node
is not the same as the string returned by the DOM
<code>nodeValue</code> method (see <bibref ref="DOM"/>).</p></note>
-->
<note><p>Für Element- und Wurzelknoten ist der Zeichenkettenwert eines
Knotens verschieden von der Zeichenkette, die von der DOM-Methode
<code>nodeValue</code> zurückgegeben wird (siehe <bibref 
ref="DOM"/>).</p></note>

<!-- ORIG
<p><termdef term="Expanded Name" id="dt-expanded-name">Some types of
node also have an <term>expanded-name</term>, which is a pair
consisting of a local part and a namespace URI. The local part is a
string.  The namespace URI is either null or a string.  The namespace
URI specified in the XML document can be a URI reference as defined in
<bibref ref="RFC2396"/>; this means it can have a fragment identifier
and can be relative.  A relative URI should be resolved into an
absolute URI during namespace processing: the namespace URIs of
<termref def="dt-expanded-name">expanded-name</termref>s of nodes in
the data model should be absolute.</termdef> Two <termref
def="dt-expanded-name">expanded-name</termref>s are equal if they have
the same local part, and either both have a null namespace URI or both
have non-null namespace URIs that are equal.</p>
-->
<p><termdef term="Erweiterter Name" id="dt-expanded-name">Einige
Knotentypen besitzen außerdem einen <term>erweiterten Namen</term> 
&ndash; ein Paar bestehend aus einem lokalen Teil und einem 
Namensraum-URI.
Der lokale Teil ist eine Zeichenkette. Der Namensraum-URI ist
entweder leer oder eine Zeichenkette. Der im XML-Dokument spezifizierte
Namensraum-URI kann eine URI-Referenz sein, wie sie in <bibref
ref="RFC2396"/> definiert ist; das bedeutet, sie kann einen
Fragment-Bezeichner besitzen und sie kann relativ sein. Ein
relativer URI sollte als absoluter URI während der 
Namensraum-Verarbeitung aufgelöst werden: Die Namensraum-URIs der
<termref def="dt-expanded-name">erweiterten Namen</termref> von Knoten
im Datenmodell sollten absolut sein.</termdef> Zwei <termref
def="dt-expanded-name">erweiterte Namen</termref> sind gleich, wenn
sie den gleichen lokalen Teil haben und wenn beide einen leeren
Namensraum-URI oder beide die gleichen, nichtleeren Namensraum-URIs 
besitzen.</p>

<!-- Errata ORIG
A namespace name specified in a namespace declaration in an XML 
document is a URI reference as defined in [RFC2396]; this implies it 
can have a fragment identifier and can be relative. The namespace URI 
component of an expanded-name is implementation-dependent if the 
expanded-name is expanded from a QName whose prefix is declared by a 
namespace declaration with a namespace name that is a relative URI 
(with or without a fragment identifier). An XPath expression that 
depends on the value of the namespace URI component of such 
expanded-names is not interoperable.
-->

<transnote>
<p>
Nach einer <loc 
href="http://lists.w3.org/Archives/Public/xml-uri/2000Sep/0083.html">Entscheidung</loc>
des W3C-XML-Plenums ist die Behandlung relativer Namensraum-URIs 
implementationsabhängig. Gemäß Errata-Dokument <bibref ref="ERRATA" /> 
müssen deshalb aus dem obigen Abschnitt die Sätze 
<emph><quote>Der im XML-Dokument spezifizierte Namensraum-URI kann
eine URI-Referenz sein, wie sie in <bibref ref="RFC2396"/> definiert 
ist; das bedeutet, sie kann einen Fragment-Bezeichner besitzen und 
sie kann relativ sein. Ein relativer URI sollte als absoluter URI 
während der Namensraum-Verarbeitung aufgelöst werden: Die 
Namensraum-URIs der
<termref def="dt-expanded-name">erweiterten Namen</termref> von Knoten
im Datenmodell sollten absolut sein.</quote></emph>
ersetzt werden durch:
</p><p>
<phrase role="errata" diff="chg">Ein in einer Namensraumdeklaration 
spezifizierter <xnt href="&XMLNames;#dt-NSName">Namensraum-Name</xnt>
in einem XML-Dokument ist eine URI-Referenz, wie sie in <bibref 
ref="RFC2396" /> definiert ist; das bedeutet, sie kann einen 
Fragment-Bezeichner besitzen und sie kann relativ sein. Die 
Namensraum-URI-Komponente eines 
<termref def="dt-expanded-name">erweiterten Namens</termref>
ist implementationsabhängig, wenn der 
<termref def="dt-expanded-name">erweiterte Name</termref>
aus einem <xnt href="&XMLNames;#NT-QName">QName</xnt>
expandiert wird, dessen Präfix durch eine Namensraumdeklaration mit 
einem relativen URI (mit oder ohne Fragment-Bezeichner) als 
Namensraum-Namen deklariert wurde. Ein XPath-Ausdruck, der vom Wert der
Namensraum-URI-Komponente eines solchen
<termref def="dt-expanded-name">erweiterten Namens</termref>
abhängt, ist nicht interoperabel.</phrase>
</p><p>
Relative URIs der Form »<code>host.example.org/namespace</code>«
(fehlendes Schema), »<code>home/schema</code>« (fehlende Host-Angabe),
»<code>http://www.w3.org/1999/../2001/XMLSchema</code>«
(mit speziellen Pfadkomponenten) oder
»<code>http://www.schema.org/address#one</code>« 
(mit Fragment-Bezeichner) sollten damit vermieden werden.
</p>
</transnote>


<!-- ORIG
<p><termdef id="dt-document-order" term="Document Order">There is an
ordering, <term>document order</term>, defined on all the nodes in the
document corresponding to the order in which the first character of
the XML representation of each node occurs in the XML representation
of the document after expansion of general entities.  Thus, the root
node will be the first node. Element nodes occur before their
children. Thus, document order orders element nodes in order of the
occurrence of their start-tag in the XML (after expansion of
entities). The attribute nodes and namespace nodes of an element occur
before the children of the element.  The namespace nodes are defined
to occur before the attribute nodes. The relative order of namespace
nodes is implementation-dependent.  The relative order of attribute
nodes is implementation-dependent.</termdef> <termdef
id="dt-reverse-document-order" term="Reverse Document
Order"><term>Reverse document order</term> is the reverse of <termref
def="dt-document-order">document order</termref>.</termdef></p>
-->
<p><termdef id="dt-document-order" term="Dokumentordnung">Es existiert
eine Ordnung, die <term>Dokumentordnung</term>, die für alle Knoten im
Dokument definiert ist und die zu der Ordnung korrespondiert, in der
die ersten Zeichen der XML-Repräsentation aller Knoten in der
XML-Repräsentation des Dokuments nach der Expandierung allgemeiner 
Entities stehen. Der Wurzelknoten ist demzufolge der erste Knoten. 
Elementknoten stehen vor ihren Kindern. Das bedeutet, die
Dokumentordnung ordnet Elementknoten in der Reihenfolge ihrer
Start-Tags im XML-Dokument (nach der Expandierung von Entities).
Attribut- und Namensraumknoten eines Elements kommen vor den Kindern
des Elements. Namensraumknoten erscheinen per Definition vor den
Attributknoten. Die relative Ordnung innerhalb der Namensraumknoten
ist implementationsabhängig. Die relative Ordnung innerhalb der
Attributknoten ist implementationsabhängig.</termdef> <termdef
id="dt-reverse-document-order" term="Umgekehrte Dokumentordnung">Die
<term>umgekehrte Dokumentordnung</term> ist die Umkehrung der <termref
def="dt-document-order">Dokumentordnung</termref>.</termdef></p>

<transnote>
<p>
Damit ist für Attribut- und Namensraumknoten die Reihenfolge der 
Repräsentation im XML-Dokument unerheblich.
</p><p>
Man darf an dieser Stelle nicht vergessen, dass die Elemente einer
Knotenmenge trotzdem immer ungeordnet sind. Die Eigenschaft, die
Knoten einer Menge in einer bestimmten Reihenfolge zu betrachten,
gehört immer zu einer Operation oder Funktion, die auf dieser Menge
ausgeführt wird. So konvertieren die Funktionen 
<function>string</function>, <function>boolean</function> und
<function>number</function> bei einer gegebenen Knotenmenge immer
den ersten Knoten bezüglich der 
<termref def="dt-document-order">Dokumentordnung</termref>. 
Entsprechend legen auf Ausdrücke angewandte Prädikate immer die
<termref def="dt-document-order">Dokumentordnung</termref> zugrunde. 
Demgegenüber legt innerhalb eines Lokalisierungsschrittes immer die
jeweilige Achse die für die dazugehörenden Prädikate relevante Ordnung 
fest. Nachdem eine Knotenmenge konstruiert wurde, ist sie (wieder)
ungeordnet. Siehe dazu auch die entsprechende Anmerkung in Kapitel
<specref ref="node-sets" />.
</p>
</transnote>

<!-- ORIG
<p>Root nodes and element nodes have an ordered list of child nodes.
Nodes never share children: if one node is not the same node as
another node, then none of the children of the one node will be the
same node as any of the children of another node.  <termdef
id="dt-parent" term="Parent">Every node other than the root node has
exactly one <term>parent</term>, which is either an element node or
the root node.</termdef> A root node or an element node is the parent
of each of its child nodes. <termdef id="dt-descendants"
term="Descendants">The <term>descendants</term> of a node are the
children of the node and the descendants of the children of the
node.</termdef></p>
-->
<p>Wurzel- und Elementknoten besitzen eine geordnete Liste von
Kindknoten. Mehrere Knoten haben niemals gemeinsame Kinder: Wenn 
ein Knoten von einem anderen Knoten verschieden ist, dann ist kein 
Kindknoten des einen Knotens mit einem der Kindknoten des anderen 
Knotens identisch. 
<termdef id="dt-parent" term="Elternknoten">Jeder Knoten
mit Ausnahme des Wurzelknotens besitzt genau einen 
<term>Elternknoten</term>, wobei dieser entweder ein Elementknoten
oder der Wurzelknoten ist.</termdef> Ein Wurzel- oder ein Elementknoten
ist der Elternknoten jedes seiner Kindknoten. <termdef
id="dt-descendants" term="Nachkommen">Die <term>Nachkommen</term> eines
Knotens sind die Kinder des Knotens sowie die Nachkommen der Kinder
des Knotens.</termdef></p>

<transnote>
<p>
Die Bezeichnungen <emph>Eltern</emph>- und <emph>Kind</emph>knoten
sind vielleicht nicht ganz glücklich. Jeder Knoten besitzt nämlich
maximal <emph>einen</emph> Elternknoten. Daneben sind Attribut- und 
Namensraumknoten vergleichbar mit rebellierenden Teenagern, die im
XPath-Datenmodell nicht als Kinder ihrer Element-Elternknoten 
betrachtet werden.
</p>
</transnote>


<div2 id="root-node">
<!-- ORIG
<head>Root Node</head>
-->
<head>Wurzelknoten</head>

<!-- ORIG
<p>The root node is the root of the tree.  A root node does not occur
except as the root of the tree.  The element node for the document
element is a child of the root node.  The root node also has as
children processing instruction and comment nodes for processing
instructions and comments that occur in the prolog and after the end
of the document element.</p>
-->
<p>Der Wurzelknoten ist die Wurzel des Baumes. Ein Wurzelknoten kommt
nur als Wurzel des Baumes vor. Der Elementknoten für das
Dokumentelement ist ein Kind des Wurzelknotens. Der Wurzelknoten hat
als Kinder ebenfalls Processing-Instruction-Knoten und Kommentarknoten 
für Processing Instructions und Kommentare, die im Prolog oder hinter
dem Ende des Dokumentelements auftreten.</p>

<transnote>
<p>
Die Dokumenttyp-Deklaration ist kein Kind des Wurzelknotens. Sie kommt
als solche an keiner Stelle im XPath-Datenmodell vor. So kann ein
XSLT-Stylesheet keine Kopie der Dokumenttyp-Deklaration erzeugen. 
Ebenso werden innerhalb der Dokumenttyp-Deklaration auftretende 
Kommentare oder Processing Instructions nicht durch XPath-Knoten 
repräsentiert. 
</p>
</transnote>

<!-- ORIG
<p>The <termref def="dt-string-value">string-value</termref> of the
root node is the concatenation of the <termref
def="dt-string-value">string-value</termref>s of all text node
<termref def="dt-descendants">descendants</termref> of the root
node in document order.</p>
-->
<p>Der <termref def="dt-string-value">Zeichenkettenwert</termref> des
Wurzelknotens ergibt sich aus der Verkettung der <termref
def="dt-string-value">Zeichenkettenwerte</termref> aller Textknoten in
Dokumentordnung, die <termref def="dt-descendants">Nachkommen</termref> 
des Wurzelknotens sind.</p>

<transnote>
<p>
Da außerhalb des Dokumentelements keine Textknoten auftreten dürfen,
gilt also
</p>
<eg>string(/) = string(/*)</eg>
<p>
oder mit anderen Worten: Der Wurzelknoten und sein (einziger)
Element-Kindknoten besitzen den gleichen 
<termref def="dt-string-value">Zeichenkettenwert</termref>.
Diesen erhält man auch, wenn aus dem Eingabedokument jegliches Markup 
entfernt und nur die Zeichendaten behalten werden.
</p><p>
Zum Vergleich: Im Document Object Model <bibref ref="DOM" /> ist 
der Wert des vergleichbaren Attributs <code>nodeValue</code> für ein 
<code>Document</code>-Objekt dagegen die leere Zeichenkette.
</p>
</transnote>

<!-- ORIG
<p>The root node does not have an <termref
def="dt-expanded-name">expanded-name</termref>.</p>
-->
<p>Der Wurzelknoten hat keinen <termref
def="dt-expanded-name">erweiterten Namen</termref>.</p>

<transnote>
<p>
Das bedeutet, dass die Funktionen <function>name</function>,
<function>local-name</function> und <function>namespace-uri</function>
als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte 
Attribut <code>nodeName</code> besitzt dagegen für das
<code>Document</code>-Objekt als Wert die Zeichenkette 
»<code>#document</code>«.
</p>
</transnote>

</div2>

<div2 id="element-nodes">
<!-- ORIG
<head>Element Nodes</head>
-->
<head>Elementknoten</head>

<!-- ORIG
<p>There is an element node for every element in the document.  An
element node has an <termref
def="dt-expanded-name">expanded-name</termref> computed by expanding
the <xnt href="&XMLNames;#NT-QName">QName</xnt> of the element
specified in the tag in accordance with the XML Namespaces
Recommendation <bibref ref="XMLNAMES"/>.  The namespace URI of the
element's <termref def="dt-expanded-name">expanded-name</termref> will
be null if the <xnt href="&XMLNames;#NT-QName">QName</xnt> has no
prefix and there is no applicable default namespace.</p>
-->

<p>Für jedes Element im Dokument gibt es einen Elementknoten. Ein
Elementknoten besitzt einen <termref
def="dt-expanded-name">erweiterten Namen</termref>, der sich durch
Expandierung des im Tag des Elements spezifizierten
<xnt href="&XMLNames;#NT-QName">QName</xnt> in Übereinstimmung mit
der XML-Namensraum-Empfehlung <bibref ref="XMLNAMES"/> ergibt. Der
Namensraum-URI des <termref def="dt-expanded-name">erweiterten
Namens</termref> des Elements ist leer, wenn der
<xnt href="&XMLNames;#NT-QName">QName</xnt> kein Präfix enthält und
es keinen anwendbaren voreingestellten Namensraum gibt.</p>

<!-- ORIG
<note><p>In the notation of Appendix A.3 of <bibref ref="XMLNAMES"/>,
the local part of the expanded-name corresponds to the
<code>type</code> attribute of the <code>ExpEType</code> element; the
namespace URI of the expanded-name corresponds to the <code>ns</code>
attribute of the <code>ExpEType</code> element, and is null if the
<code>ns</code> attribute of the <code>ExpEType</code> element is
omitted.</p></note>
-->
<note><p>In der im Anhang A.3 von <bibref ref="XMLNAMES"/> verwendeten
Notation entspricht der lokale Teil des erweiterten Namens dem
Attribut <code>type</code> des Elements <code>ExpEType</code>; der
Namensraum-URI des erweiterten Namens entspricht dem Attribut
<code>ns</code> des Elements <code>ExpEType</code> und ist leer,
wenn das Attribut <code>ns</code> des Elements <code>ExpEType</code>
weggelassen wurde.</p></note>

<!-- ORIG
<p>The children of an element node are the element nodes, comment
nodes, processing instruction nodes and text nodes for its content.
Entity references to both internal and external entities are expanded.
Character references are resolved.</p>
-->
<p>Die Kinder eines Elementknotens sind die enthaltenen Elementknoten,
Kommentarknoten, Processing-Instruction-Knoten und Textknoten.
Entity-Referenzen zu internen und externen Entities werden expandiert. 
Zeichenreferenzen werden aufgelöst.</p>

<!-- ORIG
<p>The <termref def="dt-string-value">string-value</termref> of an
element node is the concatenation of the <termref
def="dt-string-value">string-value</termref>s of all text node
<termref def="dt-descendants">descendants</termref> of the element
node in document order.</p>
-->
<p>Der <termref def="dt-string-value">Zeichenkettenwert</termref> eines
Elementknotens ergibt sich aus der Verkettung der <termref
def="dt-string-value">Zeichenkettenwerte</termref> aller Textknoten,
die <termref def="dt-descendants">Nachkommen</termref> des
Elementknotens in Dokumentordnung sind.</p>

<transnote>
<p>
Damit gilt, dass der 
<termref def="dt-string-value">Zeichenkettenwert</termref> eines
Elementknotens genauso als Verkettung der 
<termref def="dt-string-value">Zeichenkettenwerte</termref> seiner
Element- und Textkinder in Dokumentordnung aufgefasst werden kann.
</p><p>
Zum Vergleich: Im Document Object Model <bibref ref="DOM" /> ist 
dagegen der Wert des vergleichbaren Attributs <code>nodeValue</code> 
für ein <code>Element</code>-Objekt die leere Zeichenkette.
</p>
</transnote>

<div3 id="unique-id">
<!-- ORIG
<head>Unique IDs</head>
-->
<head>Eindeutige IDs</head>

<!-- ORIG
<p>An element node may have a unique identifier (ID).  This is the
value of the attribute that is declared in the DTD as type
<code>ID</code>.  No two elements in a document may have the same
unique ID.  If an XML processor reports two elements in a document as
having the same unique ID (which is possible only if the document is
invalid) then the second element in document order must be treated as
not having a unique ID.</p>
-->
<p>Ein Elementknoten kann einen eindeutigen Bezeichner (ID) besitzen.
Dies ist der Wert des Attributes, das in der DTD mit dem Typ
<code>ID</code> deklariert wurde. Keine zwei Elemente in einem
Dokument dürfen den gleichen eindeutigen Bezeichner besitzen. Falls
ein XML-Prozessor zwei Elemente in einem Dokument mit dem gleichen
eindeutigen Bezeichner meldet (was nur möglich ist, wenn das
Dokument ungültig ist), dann muss das zweite Element in Dokumentordnung
so behandelt werden, als habe es keinen eindeutigen Bezeichner.</p>

<!-- ORIG
<note><p>If a document does not have a DTD, then no element in the
document will have a unique ID.</p></note>
-->
<note><p>Wenn ein Dokument keine DTD besitzt, dann hat kein Element
des Dokuments einen eindeutigen Bezeichner.</p></note>
<transnote>
<p>
Für zwei oder mehr Elemente mit dem gleichen eindeutigen Bezeichner
liefert die Funktion <function>id</function> nur den ersten
Elementknoten in 
<termref def="dt-document-order">Dokumentordnung</termref> zurück. 
Da die Eigenschaft eines Attributes, eindeutiger Bezeichner zu sein,
in der DTD deklariert wird, kann ohne DTD dieses Attribut nicht mehr
erkannt werden. Das bedeutet, dass die Funktion <function>id</function>
nach dem Entfernen der DTD aus dem Eingabedokument für jedes
Argument nur noch die leere Knotenmenge liefert. Dies ist einer der
wenigen Fälle, in denen die Existenz einer DTD sich auf die
Auswertung eines XPath-Ausdrucks auswirkt.
</p>
</transnote>

</div3>

</div2>


<div2 id="attribute-nodes">
<!-- ORIG
<head>Attribute Nodes</head>
-->
<head>Attributknoten</head>

<!-- ORIG
<p>Each element node has an associated set of attribute nodes; the
element is the <termref def="dt-parent">parent</termref> of each of
these attribute nodes; however, an attribute node is not a child of
its parent element.</p>
-->
<p>Jedes Element besitzt eine mit ihm verbundene Menge von 
Attributknoten; das Element ist der 
<termref def="dt-parent">Elternknoten</termref> jedes dieser
Attributknoten. Allerdings ist ein Attributknoten kein Kind seines
Elternknotens.</p>

<!-- ORIG
<note><p>This is different from the DOM, which does not treat the
element bearing an attribute as the parent of the attribute (see
<bibref ref="DOM"/>).</p></note>
-->
<note><p>Dies unterscheidet sich vom DOM, welches ein Element nicht
als Elternknoten seiner Attribute behandelt (siehe
<bibref ref="DOM"/>).</p></note>

<!-- ORIG
<p>Elements never share attribute nodes: if one element node is not
the same node as another element node, then none of the attribute
nodes of the one element node will be the same node as the attribute
nodes of another element node.</p>
-->
<p>Mehrere Elemente haben niemals gemeinsame Attributknoten: Wenn ein
Elementknoten verschieden von einem anderen Elementknoten ist, dann ist
kein Attributknoten des einen Elementknotens mit einem der 
Attributknoten eines anderen Elementknotens identisch.</p>

<!-- ORIG
<note><p>The <code>=</code> operator tests whether two nodes have the
same value, <emph>not</emph> whether they are the same node.  Thus
attributes of two different elements may compare as equal using
<code>=</code>, even though they are not the same node.</p></note>
-->
<note><p>Der Operator <code>=</code> testet, ob zwei Knoten den
gleichen Wert haben, <emph>nicht</emph> ob es dieselben Knoten
sind. Vergleicht man die Attribute von zwei verschiedenen Elementen 
mittels <code>=</code>, so kann sich Gleichheit ergeben, obwohl diese 
nicht dieselben Knoten sind.</p></note>

<transnote>
<p>
Wert bedeutet hier wieder 
<termref def="dt-string-value">Zeichenkettenwert</termref>.
Tatsächlich gilt die obige Anmerkung für alle Knoten, nicht nur für
Attribute. Um die Identität zweier Knoten zu überprüfen, kann man
sich beispielsweise der in Kapitel <specref ref="node-sets" /> im 
Zusammenhang mit dem Operator <code>|</code> vorgestellten Technik 
bedienen.
</p>
</transnote>

<!-- ORIG
<p>A defaulted attribute is treated the same as a specified attribute.
If an attribute was declared for the element type in the DTD, but the
default was declared as <code>#IMPLIED</code>, and the attribute was
not specified on the element, then the element's attribute set does
not contain a node for the attribute.</p>
-->
<p>Ein vorgegebenes Attribut wird genauso behandelt wie ein
spezifiziertes Attribut. Falls für einen Elementtyp ein Attribut in der
DTD deklariert wurde, der Vorgabewert jedoch als <code>#IMPLIED</code>
deklariert und das Attribut für das Element nicht angegeben
wurde, so enthält die Attributmenge des Elements keinen Knoten für
dieses Attribut.</p>

<transnote>
<p>Beispiel:</p>
<eg><![CDATA[
<!DOCTYPE see [
<!ELEMENT see EMPTY>
<!ATTLIST see access (public|restricted) "public"
              ref    CDATA               #IMPLIED >
]>
<see />
]]></eg>
<p>
In diesem Fall besitzt der einzige Elementknoten <code>see</code> im
XPath-Datenmodell genau einen Attributknoten namens <code>access</code>
mit dem Wert <code>public</code>. Im Gegensatz zu <code>ref</code>
handelt es sich bei <code>access</code> um ein vorgegebenes Attribut.
</p><p>
Das XPath-Datenmodell liefert keinerlei Informationen darüber, ob ein
solches Attribut im Start-Tag eines Elements spezifiziert wurde oder
nicht. Im zweiten Fall ändert sich im Falle des Entfernens der 
DTD die Baumrepräsentation des XML-Dokuments, da alle vorgegebenen, 
aber nicht spezifizierten Attribute wegfallen.
</p>
</transnote>

<!-- ORIG
<p>Some attributes, such as <code>xml:lang</code> and
<code>xml:space</code>, have the semantics that they apply to all
elements that are descendants of the element bearing the attribute,
unless overridden with an instance of the same attribute on another
descendant element.  However, this does not affect where attribute
nodes appear in the tree: an element has attribute nodes only for
attributes that were explicitly specified in the start-tag or
empty-element tag of that element or that were explicitly declared in
the DTD with a default value.</p>
-->
<p>Einige Attribute, wie <code>xml:lang</code> und 
<code>xml:space</code>, besitzen die Semantik, dass sie für alle
Elemente gelten, die Nachkommen des Elements sind, das das Attribut 
trägt, es sei denn, sie wurden in einer Instanz eines 
Nachkommenelements durch das gleiche Attribut überschrieben. Das 
wirkt sich allerdings nicht darauf aus, wo Attributknoten im Baum 
vorkommen: Ein Element besitzt nur Attributknoten für die Attribute, 
die explizit im Start-Tag oder Leeres-Element-Tag dieses Elements 
angegeben wurden oder die in der DTD explizit mit einem Vorgabewert 
deklariert wurden.</p>

<transnote>
<p>
Im Zusammenhang mit der Funktion <function>lang</function> wurde auf 
diese Eigenschaft bereits hingewiesen. Ein Attribut 
<code>xml:lang</code>
wirkt sich zwar semantisch auf die Nachkommen aus, allerdings
erscheint es nicht implizit als Attributknoten bei diesen Nachkommen.
</p><p>
Damit liefert z.B. <code>//*[lang('de')]</code> in der Regel 
eine andere Knotenmenge als <code>//*[@xml:lang='de']</code>. 
Im ersten Ausdruck werden alle die Knoten ausgewählt, für die selbst 
oder für deren nächsten Vorfahren die Sprache Deutsch (<code>de</code>)
festgelegt wurde. Der zweite Ausdruck wählt dagegen nur die Knoten aus,
die ein Attribut <code>xml:lang</code> explizit oder als Vorgabewert 
mit dem Wert <code>de</code> besitzen. Abgesehen davon würde die 
zweite Variante auch Attribute wie <code>xml:lang="DE-CH"</code> 
unberücksichtigt lassen.
</p>
</transnote>

<!-- ORIG
<p>An attribute node has an <termref
def="dt-expanded-name">expanded-name</termref> and a <termref
def="dt-string-value">string-value</termref>.  The <termref
def="dt-expanded-name">expanded-name</termref> is computed by
expanding the <xnt href="&XMLNames;#NT-QName">QName</xnt> specified in
the tag in the XML document in accordance with the XML Namespaces
Recommendation <bibref ref="XMLNAMES"/>.  The namespace URI of the
attribute's name will be null if the <xnt
href="&XMLNames;#NT-QName">QName</xnt> of the attribute does not have
a prefix.</p>
-->
<p>Ein Attributknoten hat einen <termref
def="dt-expanded-name">erweiterten Namen</termref> und einen <termref
def="dt-string-value">Zeichenkettenwert</termref>. Der <termref
def="dt-expanded-name">erweiterte Name</termref> wird durch
Expandierung des im Tag im XML-Dokument angegebenen
<xnt href="&XMLNames;#NT-QName">QName</xnt> in Übereinstimmung mit der 
XML-Namensraum-Empfehlung <bibref ref="XMLNAMES"/> berechnet. Der 
Namensraum-URI des Attributnamens ist leer, falls der 
<xnt href="&XMLNames;#NT-QName">QName</xnt> des Attributs kein Präfix 
enthält.</p>

<transnote>
<p>
Entsprechend der XML-Namensraum-Empfehlung <bibref ref="XMLNAMES" />
wirkt sich somit ein voreingestellter Namensraum im Gegensatz zu 
Elementknoten nicht auf Attribute ohne Präfix aus.
</p>
</transnote>

<!-- ORIG
<note><p>In the notation of Appendix A.3 of <bibref ref="XMLNAMES"/>,
the local part of the expanded-name corresponds to the
<code>name</code> attribute of the <code>ExpAName</code> element; the
namespace URI of the expanded-name corresponds to the <code>ns</code>
attribute of the <code>ExpAName</code> element, and is null if the
<code>ns</code> attribute of the <code>ExpAName</code> element is
omitted.</p></note>
-->
<note><p>In der im Anhang A.3 von <bibref ref="XMLNAMES"/> verwendeten
Notation entspricht der lokale Teil des erweiterten Namens dem
Attribut <code>name</code> des Elements <code>ExpAName</code>; der
Namensraum-URI des erweiterten Namens entspricht dem Attribut
<code>ns</code> des Elements <code>ExpAName</code> und ist
leer, wenn das Attribut <code>ns</code> des Elements 
<code>ExpAName</code> weggelassen wurde.</p></note>

<!-- ORIG
<p>An attribute node has a <termref
def="dt-string-value">string-value</termref>.  The <termref
def="dt-string-value">string-value</termref> is the normalized value
as specified by the XML Recommendation <bibref ref="XML"/>.  An
attribute whose normalized value is a zero-length string is not
treated specially: it results in an attribute node whose <termref
def="dt-string-value">string-value</termref> is a zero-length
string.</p>
-->
<p>Ein Attributknoten besitzt einen <termref
def="dt-string-value">Zeichenkettenwert</termref>. Dieser <termref
def="dt-string-value">Zeichenkettenwert</termref> ist der durch die
XML-Empfehlung <bibref ref="XML"/> spezifizierte normalisierte
Wert. Ein Attribut, dessen normalisierter Wert eine Zeichenkette der
Länge null ist, wird nicht gesondert behandelt: Es resultiert in einem
Attributknoten, dessen <termref
def="dt-string-value">Zeichenkettenwert</termref> eine Zeichenkette
der Länge null ist.</p>

<transnote>
<p>
Normalisierung bedeutet, dass alle Entity- und Zeichenreferenzen
aufgelöst sowie alle Leerraumzeichen durch die gleiche Anzahl 
Leerzeichen ersetzt werden. Ist der Attributtyp nicht 
<code>CDATA</code>, wird der Attributwert darüber hinaus wie bei der
Anwendung der Funktion <function>normalize-space</function> umgewandelt.
</p>
</transnote>

<!-- ORIG
<note><p>It is possible for default attributes to be declared in an
external DTD or an external parameter entity.  The XML Recommendation
does not require an XML processor to read an external DTD or an
external parameter unless it is validating. A stylesheet or other facility that assumes
that the XPath tree contains default attribute values declared in an
external DTD or parameter entity may not work with some non-validating
XML processors.</p></note>
-->
<note><p>Es ist möglich, dass Attribute mit Vorgabewerten in einer
externen DTD oder einem externen Parameter-Entity deklariert werden.
Die XML-Empfehlung verlangt nicht, dass ein XML-Prozessor eine externe
DTD oder ein externes Parameter-Entity einliest, es sei denn, dieser
ist validierend. Ein Stylesheet oder ein anderes Werkzeug, das annimmt,
der XPath-Baum enthalte in einer externen DTD oder einem externen 
Parameter-Entity deklarierte Vorgabewerte, kann möglicherweise mit
nicht-validierenden XML-Prozessoren nicht funktionieren.</p></note>

<!-- ORIG
<p>There are no attribute nodes corresponding to attributes that
declare namespaces (see <bibref ref="XMLNAMES"/>).</p>
-->
<p>Es gibt keine Attributknoten zu Attributen, die Namensräume
deklarieren (siehe <bibref ref="XMLNAMES"/>).</p>

<transnote>
<p>
Attribute mit dem Namen »<code>xmlns</code>« oder dem Präfix
»<code>xmlns</code>« werden nicht als Attributknoten, sondern als
Namensraumknoten im Datenmodell repräsentiert.
</p>
</transnote>

</div2>

<div2 id="namespace-nodes">
<!-- ORIG
<head>Namespace Nodes</head>
-->
<head>Namensraumknoten</head>

<!-- ORIG
<p>Each element has an associated set of namespace nodes, one for each
distinct namespace prefix that is in scope for the element (including
the <code>xml</code> prefix, which is implicitly declared by the XML
Namespaces Recommendation <bibref ref="XMLNAMES"/>) and one for
the default namespace if one is in scope for the element.  The element
is the <termref def="dt-parent">parent</termref> of each of these
namespace nodes; however, a namespace node is not a child of
its parent element.  Elements never share namespace nodes: if one element
node is not the same node as another element node, then none of the
namespace nodes of the one element node will be the same node as the
namespace nodes of another element node. This means that an element
will have a namespace node:</p>
-->
<p>Jedem Element ist eine Menge von Namensraumknoten zugeordnet, einer
für jedes einzelne Namensraum-Präfix, das für das Element gültig ist
(einschließlich des Präfixes <code>xml</code>, das implizit durch die
XML-Namensraum-Empfehlung deklariert wird) und einer für den
voreingestellten Namensraum, falls einer für das Element gültig ist.
Das Element ist der <termref def="dt-parent">Elternknoten</termref> 
jedes dieser Namensraumknoten; ein Namensraumknoten ist allerdings 
kein Kind seines Elternelements. Mehrere Elemente haben niemals 
gemeinsame Namensraumknoten: Wenn ein Elementknoten verschieden von 
einem anderen Elementknoten ist, dann ist kein Namensraumknoten des 
einen Elementknotens mit einem der Namensraumknoten eines anderen 
Elementknotens identisch. Das bedeutet, ein Element besitzt einen
Namensraumknoten:</p>

<ulist>

<!-- ORIG
<item><p>for every attribute on the element whose name starts with
<code>xmlns:</code>;</p></item>
-->
<item><p>für jedes Attribut des Elements, dessen Name mit
<code>xmlns:</code> beginnt;</p></item>

<!-- ORIG
<item><p>for every attribute on an ancestor element whose name starts
<code>xmlns:</code> unless the element itself or a nearer ancestor
redeclares the prefix;</p></item>
-->
<item><p>für jedes Attribut eines Vorfahrenelements, dessen Name
mit <code>xmlns:</code> beginnt, es sei denn, das Element selbst oder
ein näherer Vorfahre deklariert das Präfix um;</p></item>

<item>

<!-- ORIG
<p>for an <code>xmlns</code> attribute, if the element or some
ancestor has an <code>xmlns</code> attribute, and the value of the
<code>xmlns</code> attribute for the nearest such element is
non-empty</p>
-->
<p>für ein <code>xmlns</code>-Attribut, falls das Element oder ein
Vorfahre ein <code>xmlns</code>-Attribut besitzt und der Wert des
<code>xmlns</code>-Attributs beim nächsten dieser Elemente nicht leer
ist.</p>

<!-- ORIG
<note><p>An attribute <code>xmlns=""</code> <quote>undeclares</quote>
the default namespace (see <bibref ref="XMLNAMES"/>).</p></note>
-->
<note><p>Ein Attribut <code>xmlns=""</code> <quote>undeklariert</quote>
den voreingestellten Namensraum (siehe
<bibref ref="XMLNAMES"/>).</p></note>

</item>

</ulist>

<transnote>
<p>
Namensraumdeklarationen wirken sich damit in der Regel auf die
Nachkommen des Elements aus, in dem diese Deklaration erscheint.
Im Gegensatz zu den Attributen <code>xml:lang</code> und
<code>xml:space</code> werden Namensraumknoten jedoch tatsächlich an 
die Nachkommen vererbt. Jeder Elementknoten besitzt ein eigenes 
Knoten-Exemplar für jeden gültigen Namensraum.
</p><p>
Wie bereits in Kapitel <specref ref="intro" /> an einem Beispiel
verdeutlicht wurde, folgt aus der Namensraum-Empfehlung, dass jedes 
Element wenigstens einen Namensraumknoten mit dem Präfix 
<code>xml</code> und dem Namensraum-URI 
<code>http://www.w3.org/XML/1998/namespace</code> besitzt.
</p><p>
Da das XPath-Datenmodell keine Informationen darüber enthält, an 
welchen Stellen Namensraumdeklarationen im Dokument auftreten, 
besitzen die Beispiele
</p>
<eg><![CDATA[<foo:e1 xmlns:foo="bar"><foo:e2 /></foo:e1>]]></eg>
<p>und</p>
<eg><![CDATA[<foo:e1 xmlns:foo="bar"><foo:e2 xmlns:foo="bar" /></foo:e1>]]></eg>
<p>
die gleiche Baumrepräsentation.
</p>
</transnote>

<!-- ORIG
<p>A namespace node has an <termref
def="dt-expanded-name">expanded-name</termref>: the local part is
the namespace prefix (this is empty if the namespace node is for the
default namespace); the namespace URI is always null.</p>
-->
<p>Ein Namensraumknoten besitzt einen <termref
def="dt-expanded-name">erweiterten Namen</termref>: Der lokale Teil
ist das Namensraum-Präfix (dieses ist leer, falls der Namensraumknoten
den voreingestellten Namensraum repräsentiert); der Namensraum-URI ist 
immer leer.</p>

<!-- ORIG
<p>The <termref def="dt-string-value">string-value</termref> of a
namespace node is the namespace URI that is being bound to the
namespace prefix; if it is relative, it must be resolved just like a
namespace URI in an <termref
def="dt-expanded-name">expanded-name</termref>.</p>
-->
<p>Der <termref def="dt-string-value">Zeichenkettenwert</termref> eines
Namensraumknotens ist der Namensraum-URI, der an das Namensraum-Präfix
gebunden ist. Wenn dieser relativ ist, muss er wie ein Namensraum-URI
in einem <termref def="dt-expanded-name">erweiterten Namen</termref>
aufgelöst werden.</p>

<!-- Errata ORIG
The string-value of a namespace node is the namespace URI that is being
bound to the namespace prefix; if the namespace name occurring in the 
namespace declaration in the XML document is a relative URI (with or 
without a fragment identifier), then the string-value is 
implementation-dependent. An XPath expression that depends on the 
string-value of such namespace nodes is not interoperable.
-->
<transnote>
<p>
Nach einer <loc 
href="http://lists.w3.org/Archives/Public/xml-uri/2000Sep/0083.html">Entscheidung</loc>
des W3C-XML-Plenums ist die Behandlung relativer Namensraum-URIs 
implementationsabhängig. Gemäß Errata-Dokument <bibref ref="ERRATA" /> 
muss dieser letzte Absatz durch den folgenden ersetzt werden:
</p><p>
<phrase role="errata" diff="chg">Der 
<termref def="dt-string-value">Zeichenkettenwert</termref>
eines Namensraumknotens ist der Namensraum-URI, der an das 
Namensraum-Präfix gebunden ist; wenn der in der Namensraumdeklaration 
auftretende Namensraum-Name ein relativer URI (mit oder ohne 
Fragment-Bezeichner) ist, so ist der 
<termref def="dt-string-value">Zeichenkettenwert</termref>
implementationsabhängig. Ein XPath-Ausdruck, der vom 
<termref def="dt-string-value">Zeichenkettenwert</termref>
eines solchen Namensraumknotens abhängt, ist nicht 
interoperabel.</phrase>
</p><p>
Die Definition des <termref def="dt-expanded-name">erweiterten 
Namens</termref> für Namensraumknoten mag auf den ersten Blick etwas
ungewöhnlich erscheinen. Tatsächlich wurde hier das 
Namensraum-Präfix als eigentlich relevanter Namensbestandteil dem
Schema für 
<termref def="dt-expanded-name">erweiterte Namen</termref> angepasst,
den jeder Knoten besitzt. Der Namensraum-URI des Namens ist leer, da
der Name eines Namensraumknotens nicht von anderen gültigen 
Namensraumdeklarationen abhängt.
</p><p>
Zur Illustration zwei Beispiele: Die Deklaration
<code>xmlns:prefix="urn:eindeutiger-bezeichner"</code> erzeugt einen
Namensraumknoten, dessen
<termref def="dt-expanded-name">erweiterter Name</termref> 
gleich [»<code>prefix</code>«, »«] ist. Eine Deklaration für den 
voreingestellten Namensraum
<code>xmlns="urn:eindeutiger-bezeichner"</code> führt zu einem Knoten 
mit dem <termref def="dt-expanded-name">erweiterten Namen</termref> 
[»«, »«]. Der
<termref def="dt-string-value">Zeichenkettenwert</termref> 
ist in beiden Fällen »<code>urn:eindeutiger-bezeichner</code>«.
Ein Namensraumknoten hat niemals einen leeren
<termref def="dt-string-value">Zeichenkettenwert</termref>.
</p><p>
Namensraumknoten werden benötigt, wenn in den Daten enthaltene 
qualifizierte Namen ausgewertet werden sollen. Die Typangabe in einem 
XML-Schema ist so ein Beispiel: <code>type="ob:adresse"</code>. 
Zur Ermittlung des dazugehörigen Namensraum-URIs kann folgender
Ausdruck verwendet werden:
</p>
<eg>string(namespace::*[name()=substring-before(../@type,':')])</eg>
<p>
Da der Namensraumknoten für den voreingestellten Namensraum einen 
leeren Namen besitzt und daher nicht direkt als Knotentest angegeben 
werden kann, lässt sich ein solcher Knoten nur mit Hilfe eines 
geeigneten Prädikats auswählen:
</p>
<eg>namespace::*[name()='']</eg>
</transnote>

</div2>

<div2 id="pi-nodes">
<!-- ORIG
<head>Processing Instruction Nodes</head>
-->
<head>Processing-Instruction-Knoten</head>

<!-- ORIG
<p>There is a processing instruction node for every processing
instruction, except for any processing instruction that occurs within
the document type declaration.</p>
-->
<p>Für jede Processing Instruction gibt es einen 
Processing-Instruction-Knoten, mit Ausnahme der Processing Instructions,
die innerhalb der Dokumenttyp-Deklaration erscheinen.</p>

<!-- ORIG
<p>A processing instruction has an <termref
def="dt-expanded-name">expanded-name</termref>: the local part is
the processing instruction's target; the namespace URI is null.  The
<termref def="dt-string-value">string-value</termref> of a processing
instruction node is the part of the processing instruction following
the target and any whitespace.  It does not include the terminating
<code>?&gt;</code>.</p>
-->
<p>Eine Processing Instruction besitzt einen <termref
def="dt-expanded-name">erweiterten Namen</termref>: Der lokale Teil
ist das Ziel der Processing Instruction; der Namensraum-URI ist leer. 
Der <termref def="dt-string-value">Zeichenkettenwert</termref> eines
Processing-Instruction-Knotens ist der Teil der Processing Instruction,
der dem Ziel und allem Leerraum folgt. Dieser beinhaltet nicht das
abschließende <code>?&gt;</code>.</p>

<transnote>
<p>
Die folgende Processing Instruction 
</p>
<eg>&lt;?xml-stylesheet href='style.xsl' title='Hauptstylesheet'?&gt;</eg>
<p>
wird z.B. durch einen Knoten repräsentiert, dessen
<termref def="dt-expanded-name">erweiterter Name</termref> 
[»<code>xml-stylesheet</code>«, »«] und dessen
<termref def="dt-string-value">Zeichenkettenwert</termref> 
»<code>href='style.xsl' title='Hauptstylesheet'</code>« ist.
</p><p>
Die Abschnitte, die hier wie Attribute einer Processing Instruction 
aussehen (<code>href</code> und <code>title</code>), sind in 
Wirklichkeit nur Teile des Inhalts, also des
<termref def="dt-string-value">Zeichenkettenwert</termref>s. Durch 
XPath werden an dieser Stelle keine Attributknoten bereitgestellt. 
Möchte man auf diese Pseudo-Attribute zugreifen, muss man sich mit den 
Funktionen für Zeichenketten behelfen.
</p><p>
Namensraumdeklarationen wirken sich nicht auf Processing Instructions 
aus.
</p>
</transnote>

<!-- ORIG
<note><p>The XML declaration is not a processing instruction.
Therefore, there is no processing instruction node corresponding to the
XML declaration.</p></note>
-->
<note><p>Die XML-Deklaration ist keine Processing Instruction. Daher
gibt es auch keinen Processing-Instruction-Knoten für die
XML-Deklaration.</p></note>

<transnote>
<p>
Es ist nicht möglich, auf die Angaben innerhalb der XML-Deklaration
zuzugreifen. Die Versionsnummer und die Kodierungsangabe gehören nicht 
zum XPath-Datenmodell.
</p>
</transnote>

</div2>

<div2 id="comment-nodes">
<!-- ORIG
<head>Comment Nodes</head>
-->
<head>Kommentarknoten</head>

<!-- ORIG
<p>There is a comment node for every comment, except for any comment that
occurs within the document type declaration.</p>
-->
<p>Für jeden Kommentar gibt es einen Kommentarknoten, mit Ausnahme der
Kommentare, die innerhalb der Dokumenttyp-Deklaration erscheinen.</p>

<!-- ORIG
<p>The <termref def="dt-string-value">string-value</termref> of
comment is the content of the comment not including the opening
<code>&lt;!- -</code> or the closing <code>- -&gt;</code>.</p>
-->
<p>Der <termref def="dt-string-value">Zeichenkettenwert</termref> eines
Kommentarknotens ist der Inhalt des Kommentars ohne die öffnenden
Zeichen <code>&lt;!--</code> und die schließenden Zeichen
<code>--&gt;</code>.</p>

<!-- ORIG
<p>A comment node does not have an <termref
def="dt-expanded-name">expanded-name</termref>.</p>
-->
<p>Ein Kommentarknoten besitzt keinen <termref
def="dt-expanded-name">erweiterten Namen</termref>.</p>

<transnote>
<p>
Das bedeutet, dass die Funktionen <function>name</function>, 
<function>local-name</function> und <function>namespace-uri</function> 
als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte 
Attribut <code>nodeName</code> besitzt dagegen für ein 
<code>Comment</code>-Objekt als Wert die Zeichenkette 
»<code>#comment</code>«.
</p>
</transnote>

</div2>

<div2 id="text-nodes">
<!-- ORIG
<head>Text Nodes</head>
-->
<head>Textknoten</head>

<!-- ORIG
<p>Character data is grouped into text nodes.  As much character data
as possible is grouped into each text node: a text node never has an
immediately following or preceding sibling that is a text node.  The
<termref def="dt-string-value">string-value</termref> of a text node
is the character data.  A text node always has at least one character
of data.</p>
-->
<p>Zeichendaten werden in Textknoten zusammengefasst. Dabei werden so
viele Zeichen wie möglich in jedem Textknoten zusammengefasst: Ein
Textknoten hat niemals als direkten Vorgänger oder Nachfolger einen
anderen Textknoten. Der
<termref def="dt-string-value">Zeichenkettenwert</termref> eines
Textknotens besteht aus den Zeichendaten. Ein Textknoten enthält immer
wenigstens ein Zeichen.</p>

<!-- ORIG
<p>Each character within a CDATA section is treated as character data.
Thus, <code>&lt;![CDATA[&lt;]]&gt;</code> in the source document will
treated the same as <code>&amp;lt;</code>.  Both will result in a
single <code>&lt;</code> character in a text node in the tree.  Thus, a
CDATA section is treated as if the <code>&lt;![CDATA[</code> and
<code>]]&gt;</code> were removed and every occurrence of
<code>&lt;</code> and <code>&amp;</code> were replaced by
<code>&amp;lt;</code> and <code>&amp;amp;</code> respectively.</p>
-->
<p>Jedes Zeichen innerhalb eines CDATA-Abschnittes wird wie 
Zeichendaten behandelt. So wird
<code>&lt;![CDATA[&lt;]]&gt;</code> im Quelldokument genauso behandelt
wie <code>&amp;lt;</code>. Beides ergibt das einzelne Zeichen
<code>&lt;</code> in einem Textknoten innerhalb des Baumes. Ein 
CDATA-Abschnitt wird damit so behandelt, als würden 
<code>&lt;![CDATA[</code> und <code>]]&gt;</code> entfernt und jedes 
Vorkommen von <code>&lt;</code> und <code>&amp;</code> durch
<code>&amp;lt;</code> bzw. <code>&amp;amp;</code> ersetzt
werden.</p>

<transnote>
<p>
Das XPath-Datenmodell enthält also keinerlei Informationen darüber, in
welcher Form ein Zeichen innerhalb des XML-Dokuments repräsentiert 
war. Die folgenden Textinhalte des Elements <code>x</code> werden alle
auf den gleichen Textknoten mit dem Inhalt »<code>A</code>« abgebildet:
</p>
<eg><![CDATA[
<x>A</x>
<x><![CDATA[A]]>]]<![CDATA[></x>
<x>&#65;</x>
<x>&#x0041;</x>
]]></eg>
<p>
Entsprechend würde beispielsweise der Inhalt des folgenden Elements
<code>para</code> in einem einzigen Textknoten zusammengefasst werden.
Der Beginn des CDATA-Abschnittes kann in XPath nicht bestimmt werden.
Das Document Object Model <bibref ref="DOM" /> sieht hier stattdessen
spezielle Objekte <code>Text</code> und <code>CDATASection</code> vor.
</p>
<eg><![CDATA[
<para>
   Hier folgen Beispiel &amp; Erklärung:
   <![CDATA[a > 10 and a < 20]]>]]<![CDATA[> bedeutet ...
</para>
]]></eg>
<p>
Einzelne Zeichendaten werden innerhalb des Datenmodells nicht separat
repräsentiert. Zur Verarbeitung muss deshalb auf die bereitgestellten
Zeichenkettenfunktionen zurückgegriffen werden.
</p>
</transnote>

<!-- ORIG
<note><p>When a text node that contains a <code>&lt;</code> character
is written out as XML, the <code>&lt;</code> character must be escaped
by, for example, using <code>&amp;lt;</code>, or including it in a
CDATA section.</p></note>
-->
<note><p>Wird ein Textknoten, der das Zeichen <code>&lt;</code>
enthält, als XML ausgegeben, so muss das Zeichen <code>&lt;</code>
geschützt werden, beispielsweise durch <code>&amp;lt;</code> oder
durch Einschluss in einen CDATA-Abschnitt.</p></note>

<!-- ORIG
<p>Characters inside comments, processing instructions and attribute
values do not produce text nodes. Line-endings in external entities
are normalized to #xA as specified in the XML Recommendation <bibref
ref="XML"/>.</p>
-->
<p>Zeichen innerhalb von Kommentaren, Processing Instructions und
Attributwerten erzeugen keine Textknoten. Zeilenenden in externen
Entities werden zu <code>#xA</code> normalisiert, so wie in der
XML-Empfehlung <bibref ref="XML"/> spezifiziert.</p>

<!-- Errata ORIG
Whitespace outside the document element does not produce text nodes.
-->
<transnote>
<p>
Gemäß Errata-Dokument <bibref ref="ERRATA" /> muss an dieser Stelle 
folgender Satz eingefügt werden:
</p><p>
<phrase role="errata" diff="chg">Leerraum außerhalb des 
Dokumentelements erzeugt keine Textknoten.</phrase>
</p><p>
Genau genommen lässt sich durch XPath nicht beeinflussen, ob Leerraum 
generell Textknoten erzeugen soll. Abhängig von der Applikation, die
XPath verwendet, werden für ausschließlich aus Leerraum bestehende
Bereiche Textknoten angelegt oder nicht. Die Illustration zum Beispiel
in Kapitel <specref ref="intro" /> beruht auf der Annahme, dass 
solche Leerraum-Textknoten vorhanden sind. Das ist auch das 
Standardverhalten in XSLT <bibref ref="XSLT" /> für zu verarbeitende
XML-Dokumente. Durch Verwendung der XSLT-Elemente 
<code>xsl:strip-space</code> und <code>xsl:preserve-space</code> lässt 
sich dieses Verhalten allerdings beeinflussen. Darüber hinaus werden 
Leerraum-Textknoten, die als Kind eines Elements mit 
<code>xml:space="preserve"</code> (siehe <bibref ref="XML-2" />) 
auftreten, niemals entfernt.
</p><p>
Die Existenz solcher Leerraum-Textknoten kann sich auf Kontextgröße
und -position und damit auf das Ergebnis der Funktionen
<function>last</function>, <function>position</function> und
<function>count</function> auswirken. Die Berechnung des Ausdrucks 
<code>name/text()[1]</code> für das folgende Beispiel hängt 
entscheidend davon ab, ob Leerraum-Textknoten mitgezählt werden oder 
nicht:
</p>
<eg><![CDATA[
<name>
   <anrede>Herr</anrede> Müller-Lüdenscheidt
</name>]]>
</eg>
</transnote>

<!-- ORIG
<p>A text node does not have an <termref
def="dt-expanded-name">expanded-name</termref>.</p>
-->
<p>Ein Textknoten besitzt keinen <termref
def="dt-expanded-name">erweiterten Namen</termref>.</p>

<transnote>
<p>
Das bedeutet, dass die Funktionen <function>name</function>, 
<function>local-name</function> und <function>namespace-uri</function> 
als Ergebnis die leere Zeichenkette liefern. Das in DOM definierte 
Attribut <code>nodeName</code> besitzt dagegen für 
<code>Text</code>-Objekte als Wert die Zeichenkette 
»<code>#text</code>« und für <code>CDATASection</code>-Objekte den
Wert »<code>#cdata-section</code>«.
</p>
</transnote>

</div2>

</div1>

<div1>
<!-- ORIG
<head>Conformance</head>
-->
<head>Konformität</head>

<!-- ORIG
<p>XPath is intended primarily as a component that can be used by
other specifications. Therefore, XPath relies on specifications that
use XPath (such as <bibref ref="XPTR"/> and <bibref ref="XSLT"/>) to
specify criteria for conformance of implementations of XPath and does
not define any conformance criteria for independent implementations of
XPath.</p>
-->
<p>XPath ist in erster Linie als Komponente gedacht, die von anderen
Spezifikationen genutzt werden kann. Demzufolge überlässt es XPath den
Spezifikationen, die XPath nutzen (etwa <bibref ref="XPTR"/> und 
<bibref ref="XSLT"/>), Kriterien für die Konformität von XPath zu 
spezifizieren und definiert selbst keinerlei Konformitätskriterien für 
unabhängige XPath-Implementationen.</p>

<transnote>
<p>
Die Organisation Oasis hat eine Kommission für die Konformität von 
XSLT- und XPath-Implementationen <bibref ref="OASISXSLT" /> gebildet,
die geeignete Szenarien für eine Test-Suite zusammenstellt.
</p>
</transnote>

</div1>

</body>

<back>
<div1>
<!-- ORIG
<head>References</head>
-->
<head>Referenzen</head>
<div2>
<!-- ORIG
<head>Normative References</head>
-->
<head>Normative Referenzen</head>

<blist>

<bibl id="IEEE754" key="IEEE 754">Institute of Electrical and
Electronics Engineers: <emph>IEEE Standard for Binary Floating-Point
Arithmetic</emph>. ANSI/IEEE Std 754-1985.</bibl>

<!-- ORIG
<bibl id="RFC2396" key="RFC2396">T. Berners-Lee, R. Fielding, and
L. Masinter.  <emph>Uniform Resource Identifiers (URI): Generic
Syntax</emph>. IETF RFC 2396. See <loc
href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</loc>.</bibl>
-->
<bibl id="RFC2396" key="RFC2396">T. Berners-Lee, R. Fielding und
L. Masinter: <emph>Uniform Resource Identifiers (URI): Generic
Syntax</emph>. IETF RFC 2396. Siehe <loc
href="http://www.ietf.org/rfc/rfc2396.txt">http://www.ietf.org/rfc/rfc2396.txt</loc>.</bibl>

<!-- ORIG
<bibl id="XML" key="XML">World Wide Web Consortium. <emph>Extensible
Markup Language (XML) 1.0.</emph> W3C Recommendation. See <loc
href="http://www.w3.org/TR/1998/REC-xml-19980210">http://www.w3.org/TR/1998/REC-xml-19980210</loc></bibl>
-->
<bibl id="XML" key="XML">World Wide Web Consortium: <emph>Extensible
Markup Language (XML) 1.0.</emph> W3C Recommendation. Siehe <loc
href="http://www.edition-w3c.de/TR/1998/REC-xml-19980210">http://www.edition-w3c.de/TR/1998/REC-xml-19980210</loc>.</bibl>

<!-- ORIG
<bibl id="XMLNAMES" key="XML Names">World Wide Web
Consortium. <emph>Namespaces in XML.</emph> W3C Recommendation. See
<loc
href="http://www.w3.org/TR/REC-xml-names">http://www.w3.org/TR/REC-xml-names</loc></bibl>
-->
<bibl id="XMLNAMES" key="XML Names">World Wide Web Consortium:
<emph>Namespaces in XML.</emph> W3C Recommendation. Siehe <loc
href="http://www.edition-w3c.de/TR/REC-xml-names">http://www.edition-w3c.de/TR/REC-xml-names</loc>.</bibl>

</blist>

</div2>
<div2>
<!-- ORIG
<head>Other References</head>
-->
<head>Andere Referenzen</head>

<blist>

<!-- ORIG
<bibl id="CHARMOD" key="Character Model">World Wide Web Consortium.
<emph>Character Model for the World Wide Web.</emph> W3C Working
Draft. See <loc
href="http://www.w3.org/TR/WD-charmod">http://www.w3.org/TR/WD-charmod</loc></bibl>
-->
<bibl id="CHARMOD" key="Character Model">World Wide Web Consortium:
<emph>Character Model for the World Wide Web.</emph> W3C Working
Draft. Siehe <loc
href="http://www.edition-w3c.de/TR/WD-charmod">http://www.edition-w3c.de/TR/WD-charmod</loc>.</bibl>

<!-- ORIG
<bibl id="DOM" key="DOM">World Wide Web Consortium.  <emph>Document
Object Model (DOM) Level 1 Specification.</emph> W3C
Recommendation. See <loc href="http://www.w3.org/TR/REC-DOM-Level-1"
>http://www.w3.org/TR/REC-DOM-Level-1</loc></bibl>
-->
<bibl id="DOM" key="DOM">World Wide Web Consortium:  <emph>Document
Object Model (DOM) Level 1 Specification.</emph> W3C
Recommendation. Siehe <loc href="http://www.edition-w3c.de/TR/REC-DOM-Level-1"
>http://www.edition-w3c.de/TR/REC-DOM-Level-1</loc>.</bibl>

<!-- ORIG
<bibl id="JLS" key="JLS">J. Gosling, B. Joy, and G. Steele.  <emph>The
Java Language Specification</emph>. See <loc
href="http://java.sun.com/docs/books/jls/index.html"
>http://java.sun.com/docs/books/jls/index.html</loc>.</bibl>
-->
<bibl id="JLS" key="JLS">J. Gosling, B. Joy und G. Steele:  <emph>The
Java Language Specification</emph>. Siehe <loc
href="http://java.sun.com/docs/books/jls/index.html"
>http://java.sun.com/docs/books/jls/index.html</loc>.</bibl>

<!-- ORIG
<bibl id="ISO10646" key="ISO/IEC 10646">ISO (International
Organization for Standardization).  <emph>ISO/IEC 10646-1:1993,
Information technology - Universal Multiple-Octet Coded Character Set
(UCS) - Part 1: Architecture and Basic Multilingual Plane</emph>.
International Standard. See <loc
href="http://www.iso.ch/cate/d18741.html">http://www.iso.ch/cate/d18741.html</loc>.</bibl>
-->
<bibl id="ISO10646" key="ISO/IEC 10646">ISO (International
Organization for Standardization):  <emph>ISO/IEC 10646-1:1993,
Information technology &mdash; Universal Multiple-Octet Coded Character Set
(UCS) &mdash; Part 1: Architecture and Basic Multilingual Plane</emph>.
Internationaler Standard. Siehe <loc
href="http://www.iso.ch/cate/d18741.html">http://www.iso.ch/cate/d18741.html</loc>.</bibl>


<!-- ORIG
<bibl id="TEI" key="TEI">C.M. Sperberg-McQueen, L. Burnard
<emph>Guidelines for Electronic Text Encoding and
Interchange</emph>. See <loc href="http://etext.virginia.edu/TEI.html"
>http://etext.virginia.edu/TEI.html</loc>.</bibl>
-->
<bibl id="TEI" key="TEI">C.M. Sperberg-McQueen und L. Burnard:
<emph>Guidelines for Electronic Text Encoding and
Interchange</emph>. Siehe <loc href="http://etext.virginia.edu/TEI.html"
>http://etext.virginia.edu/TEI.html</loc>.</bibl>

<!-- ORIG
<bibl id="UNICODE" key="Unicode">Unicode Consortium. <emph>The Unicode
Standard</emph>.  See <loc
href="http://www.unicode.org/unicode/standard/standard.html"
>http://www.unicode.org/unicode/standard/standard.html</loc>.</bibl>
-->
<bibl id="UNICODE" key="Unicode">Unicode Consortium: <emph>The Unicode
Standard</emph>.  Siehe <loc
href="http://www.unicode.org/unicode/standard/standard.html"
>http://www.unicode.org/unicode/standard/standard.html</loc>.</bibl>

<!-- ORIG
<bibl id="XINFO" key="XML Infoset">World Wide Web
Consortium. <emph>XML Information Set.</emph> W3C Working Draft. See
<loc
href="http://www.w3.org/TR/xml-infoset">http://www.w3.org/TR/xml-infoset</loc>
</bibl>
-->
<bibl id="XINFO" key="XML Infoset">World Wide Web Consortium: 
<emph>XML Information Set.</emph> W3C Working Draft. Siehe <loc
href="http://www.edition-w3c.de/TR/xml-infoset">http://www.edition-w3c.de/TR/xml-infoset</loc>.
</bibl>

<!-- ORIG
<bibl id="XPTR" key="XPointer">World Wide Web Consortium. <emph>XML
Pointer Language (XPointer).</emph> W3C Working Draft. See <loc
href="http://www.w3.org/TR/WD-xptr"
>http://www.w3.org/TR/WD-xptr</loc></bibl>
-->
<bibl id="XPTR" key="XPointer">World Wide Web Consortium: <emph>XML
Pointer Language (XPointer).</emph> W3C Working Draft. Siehe <loc
href="http://www.edition-w3c.de/TR/WD-xptr"
>http://www.edition-w3c.de/TR/WD-xptr</loc>.</bibl>

<!-- ORIG
<bibl id="XQL" key="XQL">J. Robie, J. Lapp, D. Schach.
<emph>XML Query Language (XQL)</emph>. See
<loc href="http://www.w3.org/TandS/QL/QL98/pp/xql.html"
>http://www.w3.org/TandS/QL/QL98/pp/xql.html</loc></bibl>
-->
<bibl id="XQL" key="XQL">J. Robie, J. Lapp und D. Schach:
<emph>XML Query Language (XQL)</emph>. Siehe
<loc href="http://www.w3.org/TandS/QL/QL98/pp/xql.html"
>http://www.w3.org/TandS/QL/QL98/pp/xql.html</loc>.</bibl>

<!-- ORIG
<bibl id="XSLT" key="XSLT">World Wide Web Consortium.  <emph>XSL
Transformations (XSLT).</emph> W3C Recommendation.  See <loc
href="http://www.w3.org/TR/xslt"
>http://www.w3.org/TR/xslt</loc></bibl>
-->
<bibl id="XSLT" key="XSLT">World Wide Web Consortium:  <emph>XSL
Transformations (XSLT).</emph> W3C Recommendation.  Siehe <loc
href="http://www.edition-w3c.de/TR/xslt"
>http://www.edition-w3c.de/TR/xslt</loc>.</bibl>

</blist>

</div2>

</div1>


<inform-div1 id="infoset">
<!-- ORIG
<head>XML Information Set Mapping</head>
-->
<head>Abbildung auf die XML-Informationsmenge</head>

<!-- ORIG
<p>The nodes in the XPath data model can be derived from the
information items provided by the XML Information Set <bibref
ref="XINFO"/> as follows:</p>
-->
<p>Die Knoten im XPath-Datenmodell lassen sich aus den durch die
XML-Informationsmenge <bibref ref="XINFO"/> bereitgestellten
Informationseinheiten wie folgt ableiten.</p>

<!-- ORIG
<note><p>A new version of the XML Information Set Working Draft, which
will replace the May 17 version, was close to completion at the time
when the preparation of this version of XPath was completed and was
expected to be released at the same time or shortly after the release
of this version of XPath.  The mapping is given for this new version
of the XML Information Set Working Draft. If the new version of the
XML Information Set Working has not yet been released, W3C members may
consult the internal Working Group version <loc
href="http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html">
http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html</loc>
(<loc href="http://cgi.w3.org/MemberAccess/">members
only</loc>).</p></note>
-->
<note><p>Eine neue Version des Arbeitsentwurfs der 
XML-Informationsmenge, die die Version vom 17. Mai (1999,
der Übersetzer) ersetzen wird, war zu der Zeit, als die 
Vorbereitung dieser Version der XPath-Spezifikation vollendet wurde,
kurz vor der Fertigstellung. Ihre Veröffentlichung wurde zur gleichen
Zeit oder kurz nach Veröffentlichung dieser Version von XPath erwartet.
Die Abbildung wird für diese neue Version des Arbeitsentwurfs der
XML-Informationsmenge angegeben. Falls die neue Version des
Arbeitsentwurfs der XML-Informationsmenge noch nicht veröffentlicht 
worden sein sollte,
können W3C-Mitglieder die interne Arbeitsgruppenversion <loc
href="http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html">
http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html</loc>
(<loc href="http://cgi.w3.org/MemberAccess/">nur für Mitglieder</loc>)
einsehen.</p></note>

<transnote>
<p>
Die XML-Informationsmenge beschreibt die aus einem XML-Dokument 
ableitbaren Informationen auf einer abstrakten Ebene. Zu diesem Zweck 
wurden elf Typen, so genannte <emph>Informationseinheiten</emph>
(information items) definiert. Jede dieser Informationseinheiten 
besitzt eine Reihe von <emph>Eigenschaften</emph> (properties).
Es wurde in der XML-Informationsmenge bewusst nicht der Term 
<quote>Knoten</quote> verwendet, um Verwechslungen mit DOM- und 
XPath-Knoten zu vermeiden. Die im XPath-Datenmodell definierten 
Knotentypen beschreiben eine Teilmenge der in der XML-Informationsmenge
verfügbaren Informationen und lassen sich daher aus diesen 
Informationseinheiten ableiten.
</p><p>
Die XML-Informationsmenge ist am 24. Oktober 2001 als W3C-Empfehlung 
verabschiedet worden. Im Vergleich zu der hier angesprochenen Version 
vom Dezember 1999 haben sich einige Details geändert. Die sich daraus 
ergebenden Änderungen bei der Abbildung des XPath-Datenmodells werden 
im Folgenden in den jeweiligen Anmerkungen angegeben.
</p>
</transnote>

<ulist>

<!-- ORIG
<item><p>The root node comes from the document information item.  The
children of the root node come from the <emph
role="infoset-property">children</emph> and <emph
role="infoset-property">children - comments</emph>
properties.</p></item>
-->
<item><p>Der Wurzelknoten folgt aus der Dokument-Informationseinheit. 
Die Kinder des Wurzelknotens folgen aus den Eigenschaften 
<emph role="infoset-property">children</emph> und 
<emph role="infoset-property">children - comments</emph>.</p>

<transnote>
<p>
Die Eigenschaft <emph role="infoset-property">children - comments</emph>
gibt es nicht mehr. Stattdessen folgen mögliche Kommentar-Kindknoten
des Wurzelknotens ebenfalls unmittelbar aus der Eigenschaft 
<emph role="infoset-property">children</emph>.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>An element node comes from an element information item.  The
children of an element node come from the <emph
role="infoset-property">children</emph> and <emph
role="infoset-property">children - comments</emph> properties. The
attributes of an element node come from the <emph
role="infoset-property">attributes</emph> property.  The namespaces
of an element node come from the <emph
role="infoset-property">in-scope namespaces</emph> property.  The
local part of the <termref
def="dt-expanded-name">expanded-name</termref> of the element node
comes from the <emph role="infoset-property">local name</emph>
property.  The namespace URI of the <termref
def="dt-expanded-name">expanded-name</termref> of the element node
comes from the <emph role="infoset-property">namespace URI</emph>
property. The unique ID of the element node comes from the <emph
role="infoset-property">children</emph> property of the attribute
information item in the <emph
role="infoset-property">attributes</emph> property that has an <emph
role="infoset-property">attribute type</emph> property equal to
<code>ID</code>.</p></item>
-->
<item><p>Ein Elementknoten folgt aus einer Element-Informationseinheit.
Die Kinder eines Elementknotens folgen aus den Eigenschaften <emph 
role="infoset-property">children</emph> und <emph 
role="infoset-property">children - comments</emph>. Die Attribute eines
Elementknotens folgen aus der Eigenschaft <emph
role="infoset-property">attributes</emph>. Die Namensräume eines
Elementknotens folgen aus der Eigenschaft <emph
role="infoset-property">in-scope namespaces</emph>. Der lokale Teil
des <termref def="dt-expanded-name">erweiterten Namens</termref>
eines Elementknotens folgt aus der Eigenschaft <emph 
role="infoset-property">local name</emph>. Der Namensraum-URI des
<termref def="dt-expanded-name">erweiterten Namens</termref> eines
Elementknotens folgt aus der Eigenschaft <emph
role="infoset-property">namespace URI</emph>. Der eindeutige Bezeichner
(ID) eines Elementknotens folgt aus der Eigenschaft <emph 
role="infoset-property">children</emph> der 
Attribut-Informationseinheit in der Eigenschaft <emph 
role="infoset-property">attributes</emph>, deren Eigenschaft <emph 
role="infoset-property">attribute type</emph> gleich <code>ID</code> 
ist.</p>

<transnote>
<p>
Die Eigenschaft <emph role="infoset-property">children - comments</emph>
gibt es nicht mehr. Stattdessen folgen mögliche Kommentar-Kindknoten
eines Elementknotens ebenfalls unmittelbar aus der Eigenschaft 
<emph role="infoset-property">children</emph>.
Der Namensraum-URI des <termref def="dt-expanded-name">erweiterten 
Namens</termref> eines Elementknotens folgt aus der Eigenschaft <emph
role="infoset-property">namespace name</emph>.
Der eindeutige Bezeichner (ID) eines Elementknotens folgt aus der 
Eigenschaft <emph role="infoset-property">normalized value</emph> der 
Attribut-Informationseinheit in der Eigenschaft <emph 
role="infoset-property">attributes</emph>, deren Eigenschaft <emph 
role="infoset-property">attribute type</emph> gleich <code>ID</code> 
ist.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>An attribute node comes from an attribute information item.
The local part of the <termref
def="dt-expanded-name">expanded-name</termref> of the attribute node
comes from the <emph role="infoset-property">local name</emph>
property.  The namespace URI of the <termref
def="dt-expanded-name">expanded-name</termref> of the attribute node
comes from the <emph role="infoset-property">namespace URI</emph>
property. The <termref def="dt-string-value">string-value</termref> of
the node comes from concatenating the <emph
role="infoset-property">character code</emph> property of each member
of the <emph role="infoset-property">children</emph>
property.</p></item>
-->
<item><p>Ein Attributknoten folgt aus einer
Attribut-Informationseinheit. Der lokale Teil des <termref
def="dt-expanded-name">erweiterten Namens</termref> des Attributknotens
folgt aus der Eigenschaft <emph role="infoset-property">local 
name</emph>. Der Namensraum-URI des <termref 
def="dt-expanded-name">erweiterten Namens</termref> des Attributknotens
folgt aus der Eigenschaft <emph role="infoset-property">namespace 
URI</emph>. Der <termref 
def="dt-string-value">Zeichenkettenwert</termref> des Knotens folgt
aus der Verkettung aller Eigenschaften <emph
role="infoset-property">character code</emph> jedes Bestandteils der
Eigenschaft <emph role="infoset-property">children</emph>.</p>

<transnote>
<p>
Der Namensraum-URI des <termref def="dt-expanded-name">erweiterten 
Namens</termref> eines Attributknotens folgt aus der Eigenschaft <emph
role="infoset-property">namespace name</emph>.
Der <termref def="dt-string-value">Zeichenkettenwert</termref> des 
Knotens folgt aus der Eigenschaft 
<emph role="infoset-property">normalized value</emph>.
Attributwerte werden gemäß der aktuellen Version der 
XML-Informationsmenge nicht weiter in einzelne 
Zeichen-Informationseinheiten zerlegt.
</p>
</transnote>
</item>

<!-- ORIG
<item><p>A text node comes from a sequence of one or more consecutive
character information items.  The <termref
def="dt-string-value">string-value</termref> of the node comes from
concatenating the <emph role="infoset-property">character code</emph>
property of each of the character information items.</p></item>
-->
<item><p>Ein Textknoten folgt aus einer Folge einer oder mehrerer
aufeinander folgender Zeichen-Informationseinheiten. Der <termref
def="dt-string-value">Zeichenkettenwert</termref> des Knotens folgt
aus der Verkettung der Eigenschaften <emph 
role="infoset-property">character code</emph> aller 
Zeichen-Informationseinheiten.</p></item>

<!-- ORIG
<item><p>A processing instruction node comes from a processing
instruction information item.  The local part of the <termref
def="dt-expanded-name">expanded-name</termref> of the node comes from
the <emph role="infoset-property">target</emph> property. (The
namespace URI part of the <termref
def="dt-expanded-name">expanded-name</termref> of the node is null.)
The <termref def="dt-string-value">string-value</termref> of the node
comes from the <emph role="infoset-property">content</emph>
property. There are no processing instruction nodes for processing
instruction items that are children of document type declaration
information item.</p></item>
-->
<item><p>Ein Processing-Instruction-Knoten folgt aus einer
Processing-Instruction-Informationseinheit. Der lokale Teil des
<termref
def="dt-expanded-name">erweiterten Namens</termref> des Knotens folgt
aus der Eigenschaft <emph role="infoset-property">target</emph>.
(Der Teil Namensraum-URI des <termref 
def="dt-expanded-name">erweiterten Namens</termref> des Knotens ist
leer.) Der <termref def="dt-string-value">Zeichenkettenwert</termref>
des Knotens folgt aus der Eigenschaft <emph 
role="infoset-property">content</emph>. Es gibt keine
Processing-Instruction-Knoten für 
Processing-Instruction-Informationseinheiten, die Kinder der
Dokumenttyp-Deklarations-Informationseinheit sind.</p></item>

<!-- ORIG
<item><p>A comment node comes from a comment information item.  The
<termref def="dt-string-value">string-value</termref> of the node
comes from the <emph role="infoset-property">content</emph> property.
There are no comment nodes for comment information items that are
children of document type declaration information item.</p></item>
-->
<item><p>Ein Kommentarknoten folgt aus einer
Kommentar-Informationseinheit. Der
<termref def="dt-string-value">Zeichenkettenwert</termref> des Knotens
folgt aus der Eigenschaft <emph
role="infoset-property">content</emph>. Es gibt keine Kommentarknoten
für Kommentar-Informationseinheiten, die Kinder der
Dokumenttyp-Deklarations-Informationseinheit sind.</p></item>

<!-- ORIG
<item><p>A namespace node comes from a namespace declaration
information item.  The local part of the <termref
def="dt-expanded-name">expanded-name</termref> of the node comes from
the <emph role="infoset-property">prefix</emph> property.  (The
namespace URI part of the <termref
def="dt-expanded-name">expanded-name</termref> of the node is null.)
The <termref def="dt-string-value">string-value</termref> of the node
comes from the <emph role="infoset-property">namespace URI</emph>
property.</p></item>
-->
<item><p>Ein Namensraumknoten folgt aus einer
Namensraumdeklarations-Informationseinheit. Der lokale Teil des
<termref def="dt-expanded-name">erweiterten Namens</termref> des
Knotens folgt aus der Eigenschaft <emph 
role="infoset-property">prefix</emph>. (Der Teil Namensraum-URI des
<termref def="dt-expanded-name">erweiterten Namens</termref> des
Knotens ist leer.) Der
<termref def="dt-string-value">Zeichenkettenwert</termref> des Knotens
folgt aus der Eigenschaft <emph role="infoset-property">namespace 
URI</emph>.</p>

<transnote>
<p>
Ein Namensraumknoten folgt aus einer Namensraum-Informationseinheit.
Der <termref def="dt-string-value">Zeichenkettenwert</termref> des 
Knotens folgt aus der Eigenschaft <emph 
role="infoset-property">namespace name</emph>.
</p>
</transnote>

</item>

</ulist>

</inform-div1>

</back>

<transback>
<div1>
<head>Zusätzliche Referenzen der deutschen Übersetzung</head>

<blist>

<bibl id="XML-2" key="XML, 2nd Edition">World Wide Web Consortium:
<emph>Extensible Markup Language (XML) 1.0 (Second Edition).</emph>
W3C Recommendation. Siehe <loc
href="http://www.edition-w3c.de/TR/2000/REC-xml-20001006">http://www.edition-w3c.de/TR/2000/REC-xml-20001006</loc>.</bibl>

<bibl id="ISO10646-2" key="ISO/IEC 10646, 2nd Edition">ISO
(International Organization for Standardization): <emph>ISO/IEC 
10646-1:2000, Information technology &mdash; Universal Multiple-Octet Coded 
Character Set (UCS) &mdash; Part 1: Architecture and Basic Multilingual 
Plane, Edition: 2 (Monolingual)</emph>. Internationaler Standard. Siehe
<loc href="http://www.iso.ch/cate/d29819.html">http://www.iso.ch/cate/d29819.html</loc>.</bibl>

<bibl id="OASISXSLT" key="XSLT-Konformität">Oasis (Organization for the 
Advancement of Structured Information Standards): 
<emph>Oasis XSLT/XPath Conformance Subcommittee</emph>. Siehe
<loc href="http://www.oasis-open.org/committees/xslt/">http://www.oasis-open.org/committees/xslt/</loc>.</bibl>

<bibl id="ERRATA" key="XPath Errata">World Wide Web Consortium:
<emph>XML Path Language (XPath) Version 1.0 Specification Errata.</emph>
29.09.2000. Siehe &ERRATALOC;.</bibl>

<bibl id="XPATHREQ" key="XPath Requirements 2.0">World Wide Web
Consortium: <emph>XPath Requirements Version 2.0.</emph>
W3C Working Draft. Siehe <loc href="http://www.edition-w3c.de/TR/xpath20req">http://www.edition-w3c.de/TR/xpath20req</loc>.</bibl>

<bibl id="XPATH20" key="XPath 2.0">World Wide Web Consortium:
<emph>XML Path Language (XPath) 2.0.</emph>
W3C Working Draft. Siehe <loc href="http://www.edition-w3c.de/TR/xpath20/">http://www.edition-w3c.de/TR/xpath20/</loc>.</bibl>

<bibl id="XPATHOP" key="XPath Operators 2.0">World Wide Web Consortium:
<emph>XQuery 1.0 and XPath 2.0 Functions and Operators.</emph>
W3C Working Draft. Siehe <loc href="http://www.edition-w3c.de/TR/xquery-operators/">http://www.edition-w3c.de/TR/xquery-operators/</loc>.</bibl>

<bibl id="XQUERY" key="XQuery">World Wide Web Consortium:
<emph>XQuery: A Query Language for XML.</emph> W3C Working Draft. Siehe
<loc href="http://www.edition-w3c.de/TR/xquery">http://www.edition-w3c.de/TR/xquery</loc>.</bibl>

<bibl id="XSLT20" key="XSLT 2.0">World Wide Web Consortium:
<emph>XSL Transformations (XSLT) Version 2.0.</emph> W3C Working Draft.
Siehe <loc href="http://www.edition-w3c.de/TR/xslt20/">http://www.edition-w3c.de/TR/xslt20/</loc>.</bibl>

</blist>
</div1>
</transback>
 
</spec>
