CINXE.COM
DTD Element Operators
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="keywords" content="xml dtd element operators, elements cdata sections, duplicate element names, syntax, programming, how to, xml tutorial, extensible markup language, learn xml"> <meta name="Description" content="Learn how to use element operators in your DTD with this free XML tutorial."> <link rel="canonical" href="https://www.quackit.com/xml/tutorial/dtd_element_operators.cfm"> <title>DTD Element Operators</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <link rel="shortcut icon" href="/pix/favicon96.png"> <link rel="apple-touch-icon" href="/pix/apple-touch-icon.png"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet"> <link href="/common/css/master.45.min.css" rel="stylesheet"> <script async src="https://cdn.fuseplatform.net/publift/tags/2/3499/fuse.js"></script> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-Q3H025ZKLN"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-Q3H025ZKLN'); </script> </head> <body> <header class="site-header"> <div class="site-header-base"> <div class="site-logo"> <a title="Quackit Homepage" target="_top" href="/"><img src="/pix/quackit_logo_watermark.png" width="87" height="33" alt="Quackit Logo"></a> </div> <button id="site-nav-toggler" class="site-nav-toggler" aria-expanded="false" aria-controls="site-nav"> <span class="sr-only">Toggle navigation</span> ☰ </button> </div> <nav id="site-nav" class="site-nav"> <div class="site-links"> <ul> <li><a href="/"><i class="fa fa-home"></i> <span class="sr-only">Home</span></a></li> <li><a href="/html/">HTML</a></li> <li><a href="/css/">CSS</a></li> <li><a href="/scripting/">Scripting</a></li> <li><a href="/database/">Database</a></li> </ul> </div> <div class="site-search-top"> <form action="/search/" id="cse-search-box-bottom" class="site-search"> <div> <input type="hidden" name="cx" value="partner-pub-6331358926293806:98x0fk-bbgi"> <input type="hidden" name="cof" value="FORID:10"> <input type="hidden" name="ie" value="ISO-8859-1"> <input type="text" name="q" size="20" class="site-search-input"> <button type="submit" name="sa" class="site-search-button"><i class="fa fa-search"></i></button> </div> </form> </div> </nav> </header> <div class="main"> <article class="content"> <h1 class="page-title">DTD Element Operators</h1> <div class="ad ad-top"> <!-- GAM 71161633/QCKIT_quackit/article_header --> <div data-fuse="23059883623"></div> </div> <ul class="pager"> <li><a href="/xml/tutorial/dtd_elements.cfm"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> DTD Elements</a></li> <li><a href="/xml/tutorial/dtd_attributes.cfm">DTD Attributes <i class="fa fa-long-arrow-right" aria-hidden="true"></i></a></li> </ul> <p class="lead">This article provides an overview of DTD element operators.</class> <p>One of the examples in the previous lesson demonstrated how to specify that an element (<code>tutorials</code>) must contain one instance of another element (<code>tutorial</code>).</p> <p>This is fine if there only needs one instance of <code>tutorial</code>, but what if we didn't want a limit. What if the <code>tutorials</code> element should be able to contain any number of <code>tutorial</code> instances? Fortunately we can do that using DTD operators.</p> <div class="ad"> <!-- GAM 71161633/QCKIT_quackit/article_incontent_1 --> <div data-fuse="23059883629"></div> </div> <p>Here's a list of operators/syntax rules we can use when defining child elements:</p> <table class="tabular"> <tr><th>Operator</th><th>Syntax</th><th>Description</th></tr> <tr><td>+</td><td><i>a</i>+</td><td>One or more occurences of <i>a</i></td></tr> <tr><td>*</td><td><i>a</i>*</td><td>Zero or more occurences of <i>a</i></td></tr> <tr><td>?</td><td><i>a</i>?</td><td>Either <i>a</i> or nothing</td></tr> <tr><td>,</td><td><i>a</i>, <i>b</i></td><td><i>a</i> followed by <i>b</i></td></tr> <tr><td>|</td><td><i>a</i> | <i>b</i></td><td><i>a</i> or <i>b</i></td></tr> <tr><td>()</td><td>(expression)</td><td>An expression surrounded by parentheses is treated as a unit and could have any one of the following suffixes ?, *, or +.</td></tr> </table> <p>Examples of usage follow.</p> <h2>Zero or More</h2> <p>To allow zero or more of the same child element, use an asterisk (<code>*</code>):</p> <p>Syntax:</p> <script src="/common/js/codemirror/lib/codemirror.js"></script> <script src="/common/js/codemirror/mode/htmlmixed/htmlmixed.js"></script> <script src="/common/js/codemirror/mode/css/css.js"></script> <script src="/common/js/codemirror/mode/javascript/javascript.js"></script> <script src="/common/js/codemirror/mode/xml/xml.js"></script> <div class="code-only"> <textarea id="example1" autocomplete="off" spellcheck="false"><!ELEMENT element_name (child_element_name*)></textarea> </div> <script> var exampleCode1 = CodeMirror.fromTextArea(document.getElementById("example1"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <script src="/common/js/codemirror/mode/htmlmixed/htmlmixed.js"></script> <div class="code-only"> <textarea id="example2" autocomplete="off" spellcheck="false"><!ELEMENT tutorials (tutorial*)></textarea> </div> <script> var exampleCode2 = CodeMirror.fromTextArea(document.getElementById("example2"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <h2>One or More</h2> <p>To allow one or more of the same child element, use a plus sign (<code>+</code>):</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example3" autocomplete="off" spellcheck="false"><!ELEMENT element_name (child_element_name+)></textarea> </div> <script> var exampleCode3 = CodeMirror.fromTextArea(document.getElementById("example3"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example4" autocomplete="off" spellcheck="false"><!ELEMENT tutorials (tutorial+)></textarea> </div> <script> var exampleCode4 = CodeMirror.fromTextArea(document.getElementById("example4"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <h2>Zero or One</h2> <p>To allow either zero or one of the same child element, use a question mark (<code>?</code>):</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example5" autocomplete="off" spellcheck="false"><!ELEMENT element_name (child_element_name?)></textarea> </div> <script> var exampleCode5 = CodeMirror.fromTextArea(document.getElementById("example5"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example6" autocomplete="off" spellcheck="false"><!ELEMENT tutorials (tutorial?)></textarea> </div> <script> var exampleCode6 = CodeMirror.fromTextArea(document.getElementById("example6"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <h2>Choices</h2> <p>You can define a choice between one or another element by using the pipe (<code>|</code>) operator. For example, if the <code>tutorial</code> element requires a child called either <code>name</code>, <code>title</code>, or <code>subject</code> (but only one of these), you can do the following:</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example7" autocomplete="off" spellcheck="false"><!ELEMENT element_name (choice_1 | choice_2 | choice_3)></textarea> </div> <script> var exampleCode7 = CodeMirror.fromTextArea(document.getElementById("example7"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example8" autocomplete="off" spellcheck="false"><!ELEMENT tutorial (name | title | subject)></textarea> </div> <script> var exampleCode8 = CodeMirror.fromTextArea(document.getElementById("example8"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <h2>Mixed Content</h2> <p>You can use the pipe (<code>|</code>) operator to specify that an element can contain both PCDATA and other elements:</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example9" autocomplete="off" spellcheck="false"><!ELEMENT element_name (#PCDATA | child_element_name)></textarea> </div> <script> var exampleCode9 = CodeMirror.fromTextArea(document.getElementById("example9"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example10" autocomplete="off" spellcheck="false"><!ELEMENT tutorial (#PCDATA | name | title | subject)*></textarea> </div> <script> var exampleCode10 = CodeMirror.fromTextArea(document.getElementById("example10"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <h2>DTD Operators with Sequences</h2> <p>You can apply any of the DTD operators to a sequence:</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example11" autocomplete="off" spellcheck="false"><!ELEMENT element_name (child_element_name dtd_operator, child_element_name dtd_operator,...)></textarea> </div> <script> var exampleCode11 = CodeMirror.fromTextArea(document.getElementById("example11"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example12" autocomplete="off" spellcheck="false"><!ELEMENT tutorial (name+, url?)></textarea> </div> <script> var exampleCode12 = CodeMirror.fromTextArea(document.getElementById("example12"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>The above example allows the <code>tutorial</code> element to contain one or more instance of the <code>name</code> element, and zero or one instance of the <code>url</code> element.</p> <h2>Subsequences</h2> <p>You can use parentheses to create a subsequence (i.e. a sequence within a sequence). This enables you to apply DTD operators to a subsequence:</p> <p>Syntax:</p> <div class="code-only"> <textarea id="example13" autocomplete="off" spellcheck="false"><!ELEMENT element_name ((sequence) dtd_operator sequence)></textarea> </div> <script> var exampleCode13 = CodeMirror.fromTextArea(document.getElementById("example13"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>Example:</p> <div class="code-only"> <textarea id="example14" autocomplete="off" spellcheck="false"><!ELEMENT tutorial ((author,rating?)+ name, url*)></textarea> </div> <script> var exampleCode14 = CodeMirror.fromTextArea(document.getElementById("example14"), { mode: "htmlmixed", tabMode: "indent", styleActiveLine: false, lineNumbers: false, lineWrapping: true, theme: "q-dark" }); </script> <p>The above example specifies that the <code>tutorial</code> element can contain one or more <code>author</code> elements, with each occurence having an optional <code>rating</code> element.</p> <ul class="pager"> <li><a href="/xml/tutorial/dtd_elements.cfm"><i class="fa fa-long-arrow-left" aria-hidden="true"></i> DTD Elements</a></li> <li><a href="/xml/tutorial/dtd_attributes.cfm">DTD Attributes <i class="fa fa-long-arrow-right" aria-hidden="true"></i></a></li> </ul> </article> <div class="sidebar"> <nav> <ul> <li> <h3><a href="/xml/tutorial/" title="">XML Tutorial</a></h3> <ul> <li><a href="/xml/tutorial/about_xml.cfm" title="">About XML</a></li> <li><a href="/xml/tutorial/xml_viewers.cfm" title="">XML Viewers</a></li> <li><a href="/xml/tutorial/xml_editors.cfm" title="">XML Editors</a></li> <li><a href="/xml/tutorial/xml_documents.cfm" title="">XML Documents</a></li> <li><a href="/xml/tutorial/xml_syntax.cfm" title="">XML Syntax</a></li> <li><a href="/xml/tutorial/xml_elements.cfm" title="">XML Elements</a></li> <li><a href="/xml/tutorial/xml_attributes.cfm" title="">XML Attributes</a></li> <li><a href="/xml/tutorial/xml_css.cfm" title="">XML with CSS</a></li> <li><a href="/xml/tutorial/xml_xsl.cfm" title="">XML with XSL</a></li> <li><a href="/xml/tutorial/xml_namespace.cfm" title="">XML Namespace</a></li> <li><a href="/xml/tutorial/xml_local_namespace.cfm" title="">XML Local Namespace</a></li> <li><a href="/xml/tutorial/xml_default_namespace.cfm" title="">XML Default Namespace</a></li> <li><a href="/xml/tutorial/xml_entities.cfm" title="">XML Entities</a></li> <li><a href="/xml/tutorial/xml_creating_entities.cfm" title="">XML Creating Entities</a></li> <li><a href="/xml/tutorial/xml_cdata.cfm" title="">XML CDATA</a></li> </ul> </li> <li> <h3 class="heading-only">DTD</h3> <ul> <li><a href="/xml/tutorial/dtd_introduction.cfm" title="">DTD Introduction</a></li> <li><a href="/xml/tutorial/dtd_doctype.cfm" title="">DTD DOCTYPE</a></li> <li><a href="/xml/tutorial/dtd_internal_dtd.cfm" title="">DTD Internal</a></li> <li><a href="/xml/tutorial/dtd_external_dtd.cfm" title="">DTD External</a></li> <li><a href="/xml/tutorial/dtd_combined_dtd.cfm" title="">DTD Combined</a></li> <li><a href="/xml/tutorial/dtd_fpi.cfm" title="">DTD FPI</a></li> <li><a href="/xml/tutorial/dtd_elements.cfm" title="">DTD Elements</a></li> <li><a href="/xml/tutorial/dtd_element_operators.cfm" title="">DTD Element Operators</a></li> <li><a href="/xml/tutorial/dtd_attributes.cfm" title="">DTD Attributes</a></li> <li><a href="/xml/tutorial/dtd_attribute_default_values.cfm" title="">DTD Attribute Default Values</a></li> <li><a href="/xml/tutorial/dtd_attribute_types.cfm" title="">DTD Attribute Types</a></li> <li><a href="/xml/tutorial/dtd_general_entities.cfm" title="">DTD General Entities</a></li> <li><a href="/xml/tutorial/dtd_parameter_entities.cfm" title="">DTD Parameter Entities</a></li> <li><a href="/xml/tutorial/dtd_embedded_images.cfm" title="">DTD Embedded Images</a></li> </ul> </li> <li> <h3 class="heading-only">XSLT</h3> <ul> <li><a href="/xml/tutorial/xslt_introduction.cfm" title="">XSLT Introduction</a></li> <li><a href="/xml/tutorial/xslt_example.cfm" title="">XSLT Example</a></li> <li><a href="/xml/tutorial/xslt_syntax.cfm" title="">XSLT Syntax</a></li> <li><a href="/xml/tutorial/xslt_template.cfm" title="">XSLT <template></a></li> <li><a href="/xml/tutorial/xslt_apply-templates.cfm" title="">XSLT <apply-templates></a></li> <li><a href="/xml/tutorial/xslt_value-of.cfm" title="">XSLT <value-of></a></li> <li><a href="/xml/tutorial/xslt_for-each.cfm" title="">XSLT <for-each></a></li> <li><a href="/xml/tutorial/xslt_sort.cfm" title="">XSLT <sort></a></li> <li><a href="/xml/tutorial/xslt_if.cfm" title="">XSLT <if></a></li> <li><a href="/xml/tutorial/xslt_choose.cfm" title="">XSLT <choose></a></li> </ul> </li> <li> <h3 class="heading-only">XPath</h3> <ul> <li><a href="/xml/tutorial/xpath_introduction.cfm" title="">XPath Introduction</a></li> <li><a href="/xml/tutorial/xpath_location_path.cfm" title="">XPath Location Path</a></li> <li><a href="/xml/tutorial/xpath_location_path_absolute.cfm" title="">XPath Location Path - Absolute</a></li> <li><a href="/xml/tutorial/xpath_location_path_relative.cfm" title="">XPath Location Path - Relative</a></li> <li><a href="/xml/tutorial/xpath_attributes.cfm" title="">XPath Attributes</a></li> <li><a href="/xml/tutorial/xpath_axis.cfm" title="">XPath Axis</a></li> <li><a href="/xml/tutorial/xpath_node_test.cfm" title="">XPath Node Test</a></li> <li><a href="/xml/tutorial/xpath_predicate.cfm" title="">XPath Predicate</a></li> <li><a href="/xml/tutorial/xpath_node_set.cfm" title="">XPath Node Set</a></li> <li><a href="/xml/tutorial/xpath_comparison_operators.cfm" title="">XPath Comparison Operators</a></li> <li><a href="/xml/tutorial/xpath_boolean_operators.cfm" title="">XPath Boolean Operators</a></li> <li><a href="/xml/tutorial/xpath_number_operators.cfm" title="">XPath Number Operators</a></li> <li><a href="/xml/tutorial/xpath_string_functions.cfm" title="">XPath String Functions</a></li> <li><a href="/xml/tutorial/xml_tutorial_summary.cfm" title="">Tutorial Summary</a></li> </ul> </li> </ul> </nav> <div class="ad ad-left"> <!-- GAM 71161633/QCKIT_quackit/article_vrec_2 --> <div data-fuse="23059511712"></div> </div> </div> <div class="ads"> <div class="ad ad-right"> <!-- GAM 71161633/QCKIT_quackit/article_vrec_1 --> <div data-fuse="23059883626"></div> </div> </div> </div> <div class="searchbox-bottom"> <form action="/search/" id="cse-search-box-bottom" class="site-search"> <div> <input type="hidden" name="cx" value="partner-pub-6331358926293806:npmuvy-i8kk"> <input type="hidden" name="cof" value="FORID:10"> <input type="hidden" name="ie" value="ISO-8859-1"> <input type="text" name="q" size="30" class="site-search-input"> <button type="submit" name="sa" class="site-search-button"><i class="fa fa-search"></i></button> </div> </form> <script src="//cse.google.com/cse/brand?form=cse-search-box-bottom&lang=en"></script> </div> <footer> <p class="about"><a href="/"><i class="fa fa-home"></i> Home</a> | <a href="/about.cfm" rel="nofollow">About</a> | <a href="/contact.cfm" rel="nofollow">Contact</a> | <a href="/terms_of_use.cfm" rel="nofollow">Terms of Use</a> | <a href="/privacy_policy.cfm" rel="nofollow">Privacy Policy</a></p> <p>© Copyright 2000 - 2024 Quackit.com </p> </footer> <script src="/common/js/spectrum/spectrum.js"></script> <script src="/common/js/lightbox2-master/dist/js/lightbox.min.js" charset="utf-8"></script> <script> $(document).ready(function(){ $( "#site-nav-toggler" ).click(function() { $( "#site-nav" ).toggle( "slow" ); }); }); </script> <script> $(function(){var a=window.location.href;$(".sidebar nav a").each(function(){a==this.href&&$(this).closest("li").addClass("selected")})}); </script> </body> </html>