Skip to content

feat(route): add xml.com articles and news route - #23331

Open
AboutRSS wants to merge 1 commit into
DIYgod:masterfrom
AboutRSS:feat/xmlcom-fulltext
Open

AboutRSS wants to merge 1 commit into
DIYgod:masterfrom
AboutRSS:feat/xmlcom-fulltext

Conversation

@AboutRSS

Copy link
Copy Markdown
Contributor

Involved Issue / 该 PR 相关 Issue

Close #

Example for the Proposed Route(s) / 路由地址示例

/xmlcom

New RSS Route Checklist / 新 RSS 路由检查表

  • New Route / 新的路由
  • Anti-bot or rate limit / 反爬/频率限制
    • If yes, do your code reflect this sign? / 如果有, 是否有对应的措施?
  • Date and time / 日期和时间
    • Parsed / 可以解析
    • Correct time zone / 时区正确
  • New package added / 添加了新的包
  • Puppeteer

Note / 说明

The route covers the articles and news items published on XML.com.

XML.com publishes its own Atom feed at /feed/all/, so the route reads that feed as its entry
list instead of scraping a listing page. The feed is served as application/atom+xml, which
ofetch would otherwise hand back as a Blob, hence the explicit responseType: 'text'. Only
the first page of the feed is requested.

What the route adds on top of the feed:

  • Full text. Every entry in the published feed is truncated to a 128 character <summary>
    and carries no <content>. The route fetches each detail page and takes the body from
    article.article > div.body. Measured on the 20 entries currently in the feed, the body is
    554 to 96,813 characters — 3x to 659x the published summary. Three of the 20 detail pages
    carry an inline <style> block inside the body, which is removed.
  • Categories. No entry in the feed carries a category. The route extracts the tags shown on
    the detail page from #tags a; 17 of the 20 entries have at least one tag.

pubDate comes from the Atom <published> element (ISO 8601, with offset), parsed with
parseDate. It is the publish date of the item; the feed carries no separate event time.
author comes from the Atom <author> element.

The site publishes an Atom feed at /feed/all/, but every entry is truncated
to a 128 character summary and none of them carry category tags. This route
consumes that feed and enriches it:

- Full text: the body is fetched from `article.article > div.body` on each
  detail page, which is 3x to 659x the length of the published summary.
- Categories: tags are extracted from `#tags a` on the detail page.

Measured against the 20 entries currently in the feed: all 20 have a unique
link, a pubDate and an author; 17 have at least one tag.
@github-actions github-actions Bot added route auto: ready to review Human review will come in after lint issues and merge conflicts are fixed labels Sep 20, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Successfully generated as following:

http://localhost:1200/xmlcom - Success ✔️
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>XML.com Atom feed for articles and news items</title>
    <link>https://www.xml.com</link>
    <atom:link href="http://localhost:1200/xmlcom" rel="self" type="application/rss+xml"></atom:link>
    <description>XML.com Atom feed for articles and news items - Powered by RSSHub</description>
    <generator>RSSHub</generator>
    <webMaster>contact@rsshub.app (RSSHub)</webMaster>
    <language>en</language>
    <lastBuildDate>Sun, 20 Sep 2026 15:15:11 GMT</lastBuildDate>
    <ttl>5</ttl>
    <item>
      <title>Release of Editix XML Editor 2027</title>
      <description>&lt;p&gt;EditiX XML Editor 2027 is now available.&lt;/p&gt;
        &lt;p&gt;EditiX is an open-source, cross-platform XML editor and development environment for working with XML, XSLT, XQuery, XPath and XML Schema.&lt;/p&gt;
        &lt;p&gt;The version 2027 introduces new AI and LLM features, including an LLM Assistant, along with numerous improvements to editing, the user interface and productivity tools...&lt;/p&gt;
        &lt;p&gt;More information about EditiX 2027:&lt;br&gt;&lt;a href=&quot;https://www.editix.com/news2027.html?utm_source=chatgpt.com&quot;&gt;https://www.editix.com/news2027.html&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-09-editix-xml-editor-2027/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-09-editix-xml-editor-2027/</guid>
      <pubDate>Fri, 11 Sep 2026 18:29:33 GMT</pubDate>
      <author>Alexandre Brillant</author>
      <category>xslt</category>
      <category>xquery</category>
      <category>xml</category>
      <category>xml editor</category>
      <category>xsd</category>
      <category>open source</category>
    </item>
    <item>
      <title>Expat 2.8.4 released, fixes 4 vulnerabilities</title>
      <description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://libexpat.github.io/&quot;&gt;libexpat&lt;/a&gt; is a fast streaming XML parser. Alongside libxml2, Expat is one of the &lt;a href=&quot;https://libexpat.github.io/doc/users/&quot;&gt;most widely used&lt;/a&gt; software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under &lt;a href=&quot;https://opensource.org/licenses/MIT&quot;&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://github.com/libexpat/libexpat/releases/tag/R_2_8_4&quot;&gt;Expat 2.8.4&lt;/a&gt; was released a few hours ago. The key motivation for cutting a release and doing so now was getting the fixes to four vulnerabilities…&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-66046&quot;&gt;CVE-2026-66046&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-76641&quot;&gt;CVE-2026-76641&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-76956&quot;&gt;CVE-2026-76956&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-76957&quot;&gt;CVE-2026-76957&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;…into the hands of the community.&lt;/p&gt;
        &lt;p&gt;The vulnerabilities were reported by &lt;a href=&quot;https://github.com/carrerasdarren-cell&quot;&gt;Darren Carreras&lt;/a&gt;, &lt;a href=&quot;https://github.com/fabwa&quot;&gt;Fabian Wahle (Hap Security)&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sorrashut-K&quot;&gt;Sorrashut Kaewtaworn&lt;/a&gt;, &lt;a href=&quot;https://github.com/liuzeyouzeyou&quot;&gt;Zeyou Liu&lt;/a&gt;, and the fixing was done by &lt;a href=&quot;https://github.com/carrerasdarren-cell&quot;&gt;Darren Carreras&lt;/a&gt;, &lt;a href=&quot;https://github.com/Sorrashut-K&quot;&gt;Sorrashut Kaewtaworn&lt;/a&gt;, &lt;a href=&quot;https://github.com/liuzeyouzeyou&quot;&gt;Zeyou Liu&lt;/a&gt;, and &lt;a href=&quot;https://github.com/hartwork&quot;&gt;me&lt;/a&gt; — thank you!&lt;/p&gt;
        &lt;p&gt;Issue &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-66046&quot;&gt;CVE-2026-66046&lt;/a&gt; is worth illustrating, and the &lt;a href=&quot;https://github.com/libexpat/libexpat/pull/1321&quot;&gt;fixing pull request&lt;/a&gt; contains an attack payload generator in &lt;a href=&quot;https://github.com/libexpat/libexpat/pull/1321&quot;&gt;its description&lt;/a&gt;. The issue was that if an attacker dials up a document like…&lt;/p&gt;
        &lt;p&gt;&amp;lt;!DOCTYPE e [ &amp;lt;!ATTLIST e a0 NMTOKEN &quot;x&quot;&amp;gt; &amp;lt;!ATTLIST e a1 NMTOKEN &quot;x&quot;&amp;gt; &amp;lt;!ATTLIST e a2 NMTOKEN &quot;x&quot;&amp;gt; ]&amp;gt; &amp;lt;e a0=&quot; v &quot; a1=&quot; v &quot; a2=&quot; v &quot; /&amp;gt;&lt;/p&gt;
        &lt;p&gt;…from 3 attributes to thousands, they could leverage the now-past quadratic runtime nature of Expat&#39;s related machinery to cause &lt;a href=&quot;https://en.wikipedia.org/wiki/Denial-of-service_attack&quot;&gt;denial of service&lt;/a&gt; even with moderatly sized payload. The fix was migrating from an &lt;code&gt;O(n)&lt;/code&gt; loop to an &lt;a href=&quot;https://en.wikipedia.org/wiki/Amortized_analysis&quot;&gt;amortized &lt;code&gt;O(1)&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Hash_table&quot;&gt;hash table lookup&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;As usual, there is also non-security work that went into this release. For instance, on the infrastructure side of things, the CI now covers &lt;a href=&quot;https://fil-c.org/&quot;&gt;Fil-C&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/RISC-V&quot;&gt;RISC-V&lt;/a&gt;, &lt;a href=&quot;https://github.com/mstorsjo/llvm-mingw&quot;&gt;Clang-based MinGW&lt;/a&gt;, and (the &lt;a href=&quot;https://en.wikipedia.org/wiki/Endianness&quot;&gt;big-endian&lt;/a&gt; architecture) &lt;a href=&quot;https://en.wikipedia.org/wiki/IBM_System/390&quot;&gt;s390x&lt;/a&gt; for the first time.&lt;/p&gt;
        &lt;p&gt;It should be noted that it was the &lt;a href=&quot;https://blog.hartwork.org/posts/libexpat-city-of-munich-open-source-sabbatical/&quot;&gt;Open Source Sabbatical of the City of Munich&lt;/a&gt; that allowed me to focus on libexpat for the community through its funding — thank you! This has been the first month, and there are hopefully five more to come; there continues to be &lt;a href=&quot;https://github.com/libexpat/libexpat/issues/1160&quot;&gt;plenty to do&lt;/a&gt;. Wish me luck!&lt;/p&gt;
        &lt;p&gt;Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
        &lt;p&gt;For more details about this release, please &lt;a href=&quot;https://github.com/libexpat/libexpat/blob/R_2_8_4/expat/Changes&quot;&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging, a bundled copy of Expat, or a pinned version of Expat, please update to version 2.8.4. Thank you!&lt;/p&gt;
        &lt;p&gt;Sebastian Pipping&lt;/p&gt;
        &lt;p&gt;This article first appeared at &lt;a href=&quot;https://blog.hartwork.org/posts/expat-2-8-4-released/&quot;&gt;blog.hartwork.org&lt;/a&gt;.&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-08-expat-284/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-08-expat-284/</guid>
      <pubDate>Mon, 31 Aug 2026 17:31:53 GMT</pubDate>
      <author>Sebastian Pipping</author>
      <category>security</category>
      <category>free software</category>
      <category>c</category>
      <category>parsing</category>
      <category>expat</category>
      <category>parsers</category>
      <category>software libre</category>
      <category>open source</category>
      <category>releases</category>
      <category>libexpat</category>
    </item>
    <item>
      <title>Toward the establishment of an international organization for XML</title>
      <description>&lt;p&gt;At Balisage 2026, more than 30 participants resolved to sponsor a public meeting, to create a working group whose purpose is to establish an international organization whose core mission is &lt;strong&gt;to protect, promote, and advance Extensible Markup Language (XML) and related technologies, and to cultivate a diverse and international community of practitioners&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Invitees&lt;/strong&gt;: Anyone interested in the establishment of an international organization for XML is welcome to attend, join the e-mail listserv, and participate in the inaugural meeting of the working group.&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Date&lt;/strong&gt;: Friday, September 25, 2026&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Time&lt;/strong&gt;: 15:00 - 17:00 Coordinated Universal Time&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;Convert to a local time here: https://www.timeanddate.com/worldclock/fixedtime.html?iso=20260925T15&amp;amp;p1=1440&lt;/p&gt;
        &lt;p&gt;(8-10 a.m. Los Angeles / 11 a.m. - 1 p.m. New York City / noon - 2 p.m. Rio de Janeiro / 4-6 p.m. London / 5-7 p.m. Berlin / 6-8 p.m. Cairo / 11 p.m. - 1 a.m. next day Hong Kong / 1 a.m. - 3 a.m. next day Melbourne)&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Venue&lt;/strong&gt;:&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;https://psu.zoom.us/j/96781675161?pwd=Jb8VebO7b1RED8a7gqOEakJBPU1VrC.1&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;Password: 10xml10&lt;/p&gt;
        &lt;p&gt;Meeting ID: 967 8167 5161&lt;/p&gt;
        &lt;p&gt;Any changes to the meeting details will be announced at the listserv.&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;&lt;strong&gt;Listserv details&lt;/strong&gt;:&amp;nbsp;&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;Request to join: https://lists.psu.edu/cgi-bin/wa?SUBED1=IOXML-L&amp;amp;A=1&amp;nbsp;&lt;/li&gt;
        &lt;li&gt;List Address: IOXML-L@LISTS.PSU.EDU&lt;/li&gt;
        &lt;li&gt;Archives: https://lists.psu.edu/cgi-bin/wa?A0=IOXML-L&lt;/li&gt;
        &lt;li&gt;List Owners: IOXML-L-request@LISTS.PSU.EDU&lt;/li&gt;
        &lt;li&gt;Unsubscribe: IOXML-L-signoff-request@LISTS.PSU.EDU&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;You can join the list by request (to be approved by the list owners).&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-08-international-organization-for-xml/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-08-international-organization-for-xml/</guid>
      <pubDate>Tue, 25 Aug 2026 16:05:44 GMT</pubDate>
      <author>Joel Kalvesmaki</author>
      <category>organization</category>
      <category>xml</category>
      <category>advocacy</category>
      <category>markup</category>
    </item>
    <item>
      <title>Expat 2.8.3 released, fixes vulnerability CVE-2026-72522</title>
      <description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://libexpat.github.io/&quot;&gt;libexpat&lt;/a&gt; is a fast streaming XML parser. Alongside libxml2, Expat is one of the &lt;a href=&quot;https://libexpat.github.io/doc/users/&quot;&gt;most widely used&lt;/a&gt; software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under &lt;a href=&quot;https://opensource.org/licenses/MIT&quot;&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://github.com/libexpat/libexpat/releases/tag/R_2_8_2&quot;&gt;Expat 2.8.3&lt;/a&gt; was released yesterday. The key motivation for cutting a release and doing so now was getting…&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;the fix to vulnerability &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-72522&quot;&gt;CVE-2026-72522&lt;/a&gt; as well as&lt;/li&gt;
        &lt;li&gt;the fix to a regression in Expat 2.8.2&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;…out to users.&lt;/p&gt;
        &lt;p&gt;The vulnerability was reported by the Mozilla Security Team, and it relates to how Expat handles decoding of &lt;a href=&quot;https://en.wikipedia.org/wiki/UTF-16&quot;&gt;UTF-16&lt;/a&gt;. The vulnerability is technically an &lt;a href=&quot;https://cwe.mitre.org/data/definitions/125.html&quot;&gt;out-of-bounds read&lt;/a&gt;, and the symptom in practice is (easy and reliable) &lt;a href=&quot;https://en.wikipedia.org/wiki/Denial-of-service_attack&quot;&gt;denial of service&lt;/a&gt; by means of an infinite loop. It should be noted that the CVSS vector by Mitre for &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-72522&quot;&gt;CVE-2026-72522&lt;/a&gt; in the &lt;a href=&quot;https://nvd.nist.gov/&quot;&gt;National Vulnerability Database&lt;/a&gt; is (once again) misclassifying the attack vector as &lt;code&gt;Local (L)&lt;/code&gt; when it should be &lt;code&gt;Network (N)&lt;/code&gt;: there are no requirements for &lt;a href=&quot;https://www.first.org/cvss/v3.1/specification-document#2-1-Exploitability-Metrics&quot;&gt;local access&lt;/a&gt; with &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-72522&quot;&gt;CVE-2026-72522&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;The regression was that on 32bit platforms and on 64bit Windows, processing XML content of 2+ GiB size &lt;a href=&quot;https://github.com/libexpat/libexpat/issues/1297&quot;&gt;was rejected as &quot;out of memory&quot; by mistake&lt;/a&gt;. The issue was reported by &lt;a href=&quot;https://github.com/evgenykotkov&quot;&gt;Evgeny Kotkov&lt;/a&gt; a week ago in the context of Subversion&#39;s use of libexpat.&lt;/p&gt;
        &lt;p&gt;Thanks to everyone who contributed to this release of Expat!&lt;/p&gt;
        &lt;p&gt;For more details about this release, please &lt;a href=&quot;https://github.com/libexpat/libexpat/blob/R_2_8_3/expat/Changes&quot;&gt;check out the change log&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;If &lt;em&gt;you&lt;/em&gt; maintain Expat packaging, a bundled copy of Expat, or a pinned version of Expat, please update to version 2.8.3. Thank you!&lt;/p&gt;
        &lt;p&gt;Sebastian Pipping&lt;/p&gt;
        &lt;p&gt;This article first appeared at &lt;a href=&quot;https://blog.hartwork.org/posts/expat-2-8-3-released/&quot;&gt;blog.hartwork.org&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-08-expat-283/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-08-expat-283/</guid>
      <pubDate>Tue, 11 Aug 2026 17:22:48 GMT</pubDate>
      <author>Sebastian Pipping</author>
      <category>security</category>
      <category>free software</category>
      <category>c</category>
      <category>parsing</category>
      <category>expat</category>
      <category>parsers</category>
      <category>software libre</category>
      <category>open source</category>
      <category>releases</category>
      <category>libexpat</category>
    </item>
    <item>
      <title>libexpat now funded by the City of Munich for up to 6 months</title>
      <description>&lt;p&gt;For readers new to Expat:&lt;/p&gt;
        &lt;p&gt;&lt;a href=&quot;https://libexpat.github.io/&quot;&gt;libexpat&lt;/a&gt; is a fast streaming XML parser. Alongside libxml2, Expat is one of the &lt;a href=&quot;https://libexpat.github.io/doc/users/&quot;&gt;most widely used&lt;/a&gt; software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under &lt;a href=&quot;https://opensource.org/licenses/MIT&quot;&gt;the MIT license&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;Starting 2026-08-01, the &lt;a href=&quot;https://github.com/libexpat/libexpat/issues/1277&quot;&gt;&quot;security vacation&quot; of the project&lt;/a&gt; has ended and(!) I will be paid to work on maintaining libexpat for up to 6 months thanks to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Munich&quot;&gt;City of Munich&lt;/a&gt; under the umbrella of their &lt;a href=&quot;https://opensource.muenchen.de/software/libexpat.html#open-source-sabbatical&quot;&gt;Open Source Sabbatical&lt;/a&gt; program.&lt;br&gt;What does that mean?&lt;/p&gt;
        &lt;p&gt;For much of the past 10 years, working on libexpat has been competing with my regular occupation as a software engineer, chores, social life and re-creation. For the first time, I am now being employed to work on maintaining libexpat as my &quot;regular job&quot; for a limited period of time. My top priorities will be:&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;
        &lt;p&gt;Fixing the &lt;a href=&quot;https://github.com/libexpat/libexpat/issues/1160&quot;&gt;currently 5 known unfixed vulnerabilities&lt;/a&gt;&lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
        &lt;p&gt;Adding &lt;a href=&quot;https://github.com/libexpat/libexpat/issues/171&quot;&gt;support for XML 1.0r5&lt;/a&gt;&lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
        &lt;p&gt;Further improving the robustness and maintainability of the project&lt;/p&gt;
        &lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;Yesterday and today most of my time went into fixing a &lt;a href=&quot;https://github.com/libexpat/libexpat/pull/1296&quot;&gt;vulnerability uncovered by Mozilla&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;Technically, I am being employed by &lt;a href=&quot;https://digital-at-m.de/&quot;&gt;digitial@M&lt;/a&gt; now for of up 6 months with a regular working contract, including cancellation by either party, remotely from home. There is plenty to do.&lt;/p&gt;
        &lt;p&gt;Unvalidated AI slop submissions will still not be apprecated, but for everything else: if you want to throw intelligence at finding further vulnerabilities in libexpat and &lt;a href=&quot;mailto:sebastian@pipping.org&quot;&gt;send them my way&lt;/a&gt;, the coming months will be the best chance at getting things fixed in reasonable time. &lt;a href=&quot;https://en.wikipedia.org/wiki/Queueing_theory&quot;&gt;Queueing theory&lt;/a&gt; and laws of physics still apply.&lt;/p&gt;
        &lt;p&gt;Wish me luck!&lt;/p&gt;
        &lt;p&gt;Best, Sebastian&lt;/p&gt;
        &lt;p&gt;This article first appeared at &lt;a href=&quot;https://blog.hartwork.org/posts/libexpat-city-of-munich-open-source-sabbatical/&quot;&gt;blog.hartwork.org&lt;/a&gt;.&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-08-libexpat-funded-munich/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-08-libexpat-funded-munich/</guid>
      <pubDate>Mon, 10 Aug 2026 17:03:21 GMT</pubDate>
      <author>Sebastian Pipping</author>
      <category>free software</category>
      <category>c</category>
      <category>parsing</category>
      <category>expat</category>
      <category>parsers</category>
      <category>software libre</category>
      <category>open source</category>
      <category>security</category>
      <category>libexpat</category>
    </item>
    <item>
      <title>Balisage 2026 preliminary proceedings now available</title>
      <description>&lt;p&gt;The pre-conference edition of the &lt;strong&gt;B&lt;/strong&gt;alisage 2026 Proceedings is now available:&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://www.balisage.net/Proceedings/vol31/contents.html&quot;&gt;https://www.balisage.net/Proceedings/vol31/contents.html&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&lt;br&gt;After the conference these proceedings will be enhanced with speakers&#39; slides, corrections to papers, and (probably) a few more papers.&lt;br&gt;&lt;br&gt;Balisage 2026 is &lt;strong&gt;next week&lt;/strong&gt;!&lt;br&gt;&lt;br&gt;&lt;/p&gt;
        &lt;p&gt;Take a look. Is this an event you want to attend? Is there a paper or two that really interest you? Do you want to participate in the conversation after some of these presentations? Balisage is &lt;strong&gt;all virtual&lt;/strong&gt;, so you can come for the parts that catch your interest. Register for a day, two days, or the whole week!&lt;br&gt;&lt;br&gt;Registration: &amp;nbsp;&lt;a href=&quot;https://balisage.net/registration.html&quot;&gt;https://balisage.net/registration.html&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;Conference overview: &lt;a href=&quot;https://balisage.net/&quot;&gt;https://balisage.net/&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;Note: if your registration is not acknowledged within 24 hours please send email to btusdin@mulberrytech.com&lt;br&gt;&lt;br&gt;Questions: &lt;a href=&quot;mailto:info@balisage.net&quot;&gt;info@balisage.net&lt;/a&gt;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-07-balisage-2026-preliminary-proceedings/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-07-balisage-2026-preliminary-proceedings/</guid>
      <pubDate>Thu, 30 Jul 2026 20:13:39 GMT</pubDate>
      <author>Joel Kalvesmaki</author>
      <category>conferences</category>
      <category>balisage</category>
      <category>markup</category>
    </item>
    <item>
      <title>The Future of Markup: A Balisage Conversation</title>
      <description>&lt;p&gt;At the last Balisage conference, we wish to focus not on our past but our future. A special series of Birds of a Feather conversations will explore the trajectories we might take as we navigate our technological ecosystems. Perhaps, out of these conversations, new ideas or projects will emerge to enrich the markup community.&lt;br&gt;&lt;br&gt;The series of conversations will take the title &quot;The Future of Markup&quot;, and each conversation will have a theme, the first being &quot;An International Organization for XML?&quot; Up to eight participants who wish to do so will be invited to present initial statements (maximum five minutes), after which, we will all engage in discussions both lively and respectful. Our conversation may take unexpected turns. At the end of one conversation, participants will vote on the theme of the next &quot;The Future of Markup&quot; conversation.&lt;br&gt;&lt;br&gt;To encourage global participation, each themed conversation will be spread across two sessions, at two different times of day. If you wish to present an initial statement, please send an email to &lt;a href=&quot;mailto:info@balisage.net&quot;&gt;info@balisage.net&lt;/a&gt;.&lt;br&gt;&lt;br&gt;About Balisage: &lt;a href=&quot;https://www.balisage.net/index.html&quot;&gt;https://www.balisage.net/index.html&lt;/a&gt;&lt;br&gt;Registration: &lt;a href=&quot;https://www.balisage.net/registration.html&quot;&gt;https://www.balisage.net/registration.html&lt;/a&gt;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-07-the-future-of-markup/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-07-the-future-of-markup/</guid>
      <pubDate>Wed, 22 Jul 2026 15:14:02 GMT</pubDate>
      <author>Joel Kalvesmaki</author>
      <category>conferences</category>
      <category>balisage</category>
      <category>markup</category>
    </item>
    <item>
      <title>Elemental 6.11.0 and 7.7.0 have been released</title>
      <description>&lt;p&gt;We are delighted to announce that Elemental versions 6.11.0 and 7.7.0 have just been released.&lt;/p&gt;
        &lt;p&gt;We were a little behind schedule with these two releases (i.e. release every two months). By way of excuse, whilst the Change Log for the releases looks small, there were a huge amount of internal changes made to improve things; we modified in excess of 500 files.&lt;br&gt;&lt;br&gt;These releases include a small number of important bug fixes, a new Java API for executing an XQuery whilst ensuring all resources are reclaimed, support for the XML Calabash 3 XProc Processor, and a few performance improvements that reduce resource contention when executing XQuery. The main highlights are that:&lt;br&gt;&lt;br&gt;There is a new API for executing XQuery and ensuring all resources used in execution are cleaned up. All XQuery execution in Elemental now goes through this API; through that change we have also removed a number of resource leaks (inherited from eXist-db) associated with executing XQuery code. This also now fully enables our support for XQuery execution via Elemental in XML Calabash 3 XProc Processor.&lt;br&gt;&lt;br&gt;Previously (inherited from eXist-db) when executing an XQuery which is stored in the database, the XQuery document would be locked for the duration of its compilation and execution. Now, in Elemental, the XQuery document is only locked during compilation. This greatly reduces contention on XQuery documents, and fixes some concurrency issues that were encountered when editing XQuery documents from oXygen XML Editor or eXide.&lt;/p&gt;
        &lt;p&gt;The releases are available from:&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;&lt;a href=&quot;https://github.com/evolvedbinary/elemental/releases/tag/elemental-6.11.0&quot;&gt;https://github.com/evolvedbinary/elemental/releases/tag/elemental-6.11.0&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=&quot;https://github.com/evolvedbinary/elemental/releases/tag/elemental-7.7.0&quot;&gt;https://github.com/evolvedbinary/elemental/releases/tag/elemental-7.7.0&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;h3&gt;&lt;br&gt;Features&lt;/h3&gt;
        &lt;ol&gt;
        &lt;li&gt;
        &lt;p&gt;There is a new API for executing XQuery and ensuring all resources used in execution are cleaned up. All XQuery execution in Elemental now goes through this API; through that change we have also removed a number of resource leaks associated with executing XQuery code. This also now fully enables our support for XQuery execution via Elemental in XML Calabash 3 XProc Processor - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/224&quot;&gt;#264&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;
        &lt;/li&gt;
        &lt;li&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
        When executing an XQuery which is stored in the database, the XQuery document is now only locked during compilation. This greatly reduces contention on XQuery documents, and fixes some concurrency issues that were encountered when editing XQuery documents from oXygen XML Editor or eXide - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/229&quot;&gt;#229&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;
        &lt;p&gt;Added a new &lt;code&gt;system:get-main-module-load-path()&lt;/code&gt; XPath function to restore compatibility with TEI-Publisher - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/231&quot;&gt;#231&lt;/a&gt;&lt;/p&gt;
        &lt;/li&gt;
        &lt;/ol&gt;
        &lt;h3&gt;Bug Fixes&lt;/h3&gt;
        &lt;ol&gt;
        &lt;li&gt;Restore support for oXygen XML Editor - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/215&quot;&gt;#215&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
        &lt;li&gt;Ensure that the Base URI is always a valid URI; relative XSLT imports from XSLT documents stored in the database now resolve correctly - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/219&quot;&gt;#219&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
        &lt;li&gt;Ensure that the Base URI of in-memory documents is set correctly - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/204&quot;&gt;#204&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
        &lt;li&gt;Set the HTTP Response Content-Type when writing JSON results from the REST API - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/212&quot;&gt;#212&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;
        &lt;li&gt;Improve the resolution and loading of configuration files on Windows platforms - &lt;a href=&quot;https://github.com/evolvedbinary/elemental/pull/216&quot;&gt;#216&lt;/a&gt;&lt;/li&gt;
        &lt;/ol&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
        &lt;h3&gt;Backwards Compatibility&lt;/h3&gt;
        &lt;ul&gt;
        &lt;li&gt;Elemental 6.11.0 is 100% backwards compatible with Elemental 6.10.10(and eXist-db 6.4.0), and it should be a simple drop-in replacement for any user. Like Elemental 6.10.0 it requires Java 8.&lt;/li&gt;
        &lt;li&gt;Elemental 7.7.0 is 100% backwards compatible with Elemental 7.6.0, and it should be a simple drop-in replacement for any user. Like Elemental 7.6.0 it requires Java 21.&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;Further information and downloads can be found here: &lt;a href=&quot;https://github.com/evolvedbinary/elemental/releases&quot;&gt;https://github.com/evolvedbinary/elemental/releases&lt;/a&gt;&lt;/p&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-07-elemental-6110-and-770/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-07-elemental-6110-and-770/</guid>
      <pubDate>Wed, 22 Jul 2026 15:12:43 GMT</pubDate>
      <author>Adam Retter</author>
      <category>xslt</category>
      <category>xquery</category>
      <category>exist-db</category>
      <category>xml</category>
      <category>elemental</category>
      <category>nosql</category>
      <category>xmldb</category>
    </item>
    <item>
      <title>Fore 4.0.0 is out</title>
      <description>&lt;p&gt;We are happy to annouce that Fore 4.0.0 has been released.&amp;nbsp;&lt;/p&gt;
        &lt;p&gt;It offers major improvments:&lt;br&gt;* substancial performance enhancements&lt;/p&gt;
        &lt;p&gt;* undo/redo capability&lt;/p&gt;
        &lt;p&gt;* progressive + virtualized repeats for fast-loading big repeated datasets&lt;/p&gt;
        &lt;p&gt;* a 20% reduced bundle&lt;/p&gt;
        &lt;p&gt;* WCAG accessibility reports, mostly implemented with details on implementation&lt;/p&gt;
        &lt;p&gt;* a minimap for navigating big pages&lt;/p&gt;
        &lt;p&gt;* many bugfixes and new tests&lt;/p&gt;
        &lt;p&gt;It can be downloaded from https://github.com/jinntec/fore. Online demos are here: https://jinntec.github.io/Fore/doc/demos.html&lt;/p&gt;
        &lt;p&gt;&amp;nbsp;&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-07-fore-400/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-07-fore-400/</guid>
      <pubDate>Wed, 15 Jul 2026 16:14:32 GMT</pubDate>
      <author>Joern Turner</author>
      <category>forms</category>
      <category>xforms</category>
      <category>web components</category>
      <category>xml + json</category>
    </item>
    <item>
      <title>Finalized Balisage 2026 program (3-7 August 2026)</title>
      <description>&lt;p&gt;The &lt;a href=&quot;https://balisage.net/2026/Program.html&quot;&gt;Balisage 2026 program&lt;/a&gt; is now complete! When the peer-reviewed Balisage program was scheduled, a few slots were reserved for Late-breaking material. The late-breaking papers have been added to a rearranged schedule: https://balisage.net/2026/Program.html&lt;br&gt;&lt;br&gt;Balisage 2026 will be:&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;All virtual&lt;/li&gt;
        &lt;li&gt;Interactive&lt;/li&gt;
        &lt;li&gt;Live&lt;/li&gt;
        &lt;li&gt;The last Balisage Conference&lt;/li&gt;
        &lt;li&gt;3 – 7 August 2026&lt;/li&gt;
        &lt;/ul&gt;
        &lt;p&gt;&lt;br&gt;&lt;br&gt;Registration: You can register at https://balisage.net/registration.html. Early in your career? Is the registration fee challenging? We still want you to participate! Additional options for attendance are listed on the Registration page.&lt;br&gt;&lt;br&gt;The Birds of a Feather sessions will include a series of conversations devoted to the future of markup.&lt;/p&gt;
      </description>
      <link>https://www.xml.com/news/2026-07-finalized-balisage-2026/</link>
      <guid isPermaLink="false">https://www.xml.com/news/2026-07-finalized-balisage-2026/</guid>
      <pubDate>Wed, 08 Jul 2026 22:55:10 GMT</pubDate>
      <author>Joel Kalvesmaki</author>
      <category>conferences</category>
      <category>balisage</category>
      <category>markup</category>
    </item>
    <item>
      <title>How to Evaluate Your XSLT Editor</title>
      <description>&lt;p&gt;&lt;i&gt;“XSLT (Extensible Stylesheet Language Transformations) remains one of the most capable—and most underestimated—technologies for transforming structured content.”&lt;/i&gt; (Vasu Chakkera, 2025). &lt;/p&gt;
        &lt;p&gt;So it is understandable that XSLT is an important technology in fields such as in publishing and governmental data exchange. Fortunately, it is still getting more and more powerful. Especially the latest version of XSLT (XSLT 3.0) combined with XPath 3.1 is extremely powerful. It overcomes several issues of the earlier versions: you can now also transform Json files, it is far less verbose, you can use text value templates, XPaths can be evaluated dynamically, functions and types are added, the function set is extended with Sequences, Arrays and Maps and finally streaming is supported (for more explanation, I recommend reading: &lt;a href=&quot;https://www.xml.com/articles/2017/02/14/why-you-should-be-using-xslt-30/&quot;&gt;Why You Should Be Using XSLT 3.0&lt;/a&gt;).&lt;/p&gt;
        &lt;p&gt;But all these capabilities come with a cost: XSLT and XPath are not trivial: they have a steep learning curve, and are so extensive, it is practically impossible to know and use all features by heart. Having an editor that helps you write correct XSLT 3.0 and XPath 3.1 quickly can make a significant difference in both productivity and correctness.&lt;/p&gt;
        &lt;p&gt;Many XSLT editors are available, and you may be using one already for years. Switching is not an easy step: e.g. how do you determine whether a new tool would be worth the learning process? This article outlines criteria you can use to assess whether an editor truly supports modern XSLT development. &lt;/p&gt;&lt;p&gt;I have based the criteria on the W3C specifications for &lt;a href=&quot;https://www.w3.org/TR/xslt/&quot;&gt;XSLT&lt;/a&gt; and &lt;a href=&quot;https://www.w3.org/TR/xpath/&quot;&gt;XPath&lt;/a&gt; —after all, the primary task of an editor is to help you produce code that conforms to those standards.&lt;/p&gt;
        &lt;p&gt;Next to the general criterion of supporting the latest standards, I distinguish three main use cases your editor should support: viewing, editing, and running. Below I elaborate on the criteria and I provide several test cases you can use to evaluate your tool.&lt;/p&gt;
        &lt;h2&gt;Support for the Latest Standards&lt;/h2&gt;
        &lt;p&gt;The older standards (XSLT 1.0 and 2.0) are no longer maintained and Chromium has even planned to fully remove support for XSLT 1.0 from the Chrome browser. Luckily, XSLT 3.0 and XPath 3.1 are very much alive-and-kicking in the world of publishing, finances and governments. Editors that support XSLT 3.0 and XPath 3.1 are OxygenXML, XMLSpy, XMLBlueprint and VSCode (with the XSLT/XPath extension). &lt;/p&gt;
        &lt;h2&gt;Viewing your XSLT&lt;/h2&gt;
        &lt;p&gt;Even before editing or executing a transformation, an editor has several ways to help you understand your code.&lt;/p&gt;
        &lt;h3&gt;Syntax Coloring&lt;/h3&gt;
        &lt;p&gt;Good syntax coloring improves readability by distinguishing the structural components of XSLT and XPath.&lt;/p&gt;
        &lt;p&gt;Is the coloring correct according to the XSLT and XPath grammar?&lt;br&gt;To test correctness, try expressions that mix names and operators:&lt;/p&gt;
        &lt;p&gt;&lt;code&gt;&amp;lt;xsl:value-of select=&quot;and and and and and&quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;
        &lt;p&gt;Correct coloring should distinguish &lt;b&gt;&lt;span style=&quot;color:darkgreen&quot;&gt;and&lt;/span&gt;&lt;/b&gt; &lt;b&gt;as a name&lt;/b&gt; from &lt;b&gt;&lt;span style=&quot;color:darkgreen&quot;&gt;and&lt;/span&gt;&lt;/b&gt; &lt;b&gt;as a boolean operator&lt;/b&gt; (see XPath &lt;a href=&quot;https://www.w3.org/TR/xpath-31/#doc-xpath31-AndExpr&quot;&gt;AndExpr&lt;/a&gt; and &lt;a href=&quot;https://www.w3.org/TR/xpath-31/%23doc-xpath31-NameTest&quot;&gt;NameTest&lt;/a&gt;). So the correct coloring would be:&lt;/p&gt;
        &lt;p&gt;&amp;lt;xsl:value-of select=&quot;and &lt;span style=&quot;color:green&quot;&gt;and&lt;/span&gt; and &lt;span style=&quot;color:green&quot;&gt;and&lt;/span&gt; and”/&amp;gt;&lt;/p&gt;
        &lt;p&gt;Other examples to test:&lt;/p&gt;
        &lt;ul&gt;
        &lt;li&gt;&amp;lt;xsl:value-of select=&quot;&lt;span style=&quot;color:darkgreen&quot;&gt;gt&lt;/span&gt; &lt;span style=&quot;color:lightgreen&quot;&gt;gt&lt;/span&gt; &lt;span style=&quot;color:green&quot;&gt;gt&lt;/span&gt; gt gt gt gt gt gt&quot;/&amp;gt;&lt;/li&gt;
        &lt;li&gt;&amp;lt;xsl:value-of select=&quot;&lt;span style=&quot;color: lightgreen&quot;&gt;123&lt;/span&gt; &lt;span style=&quot;color:green&quot;&gt;treat as&lt;/span&gt; xs:integer + &lt;span style=&quot;color:green&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;color: lightgreen&quot;&gt;+ 3&lt;/span&gt;&quot;/&amp;gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;h3&gt;Tooltips&lt;/h3&gt;
        &lt;p&gt;Tooltips help you understand XPath expressions quickly by showing inline documentation—ideally with syntax coloring and hyperlinks.&lt;/p&gt;
        &lt;figure class=&quot;img-wrapper mid&quot;&gt;
        &lt;a href=&quot;https://www.xml.com/media/images/image1.width-1280.png&quot; target=&quot;_blank&quot;&gt;
        &lt;img src=&quot;https://www.xml.com/media/images/image1.width-1280.png&quot; alt=&quot;Tooltip from Oxygen&quot; width=&quot;1048&quot; height=&quot;389&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
        &lt;figcaption&gt;
        Example tooltip on a function from Oxygen
        &lt;/figcaption&gt;
        &lt;/figure&gt;
        &lt;p&gt;Evaluate:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Are the tooltips clear and readable?&lt;/li&gt;
        &lt;li&gt;Do they include syntax coloring?&lt;/li&gt;
        &lt;li&gt;Are there links to documentation?&lt;/li&gt;
        &lt;li&gt;Do they appear for &lt;i&gt;all&lt;/i&gt; XPath components?&lt;/li&gt;&lt;/ul&gt;
        &lt;figure class=&quot;img-wrapper mid&quot;&gt;
        &lt;a href=&quot;https://www.xml.com/media/images/image4_TZxlfL1.width-1280.png&quot; target=&quot;_blank&quot;&gt;
        &lt;img src=&quot;https://www.xml.com/media/images/image4_TZxlfL1.width-1280.png&quot; alt=&quot;Pi function operator&quot; width=&quot;1086&quot; height=&quot;140&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
        &lt;figcaption&gt;
        Example tooltip on an operator from XMLBlueprint
        &lt;/figcaption&gt;
        &lt;/figure&gt;
        &lt;h3&gt;Jump-to-Definition&lt;/h3&gt;
        &lt;p&gt;To save time navigating larger stylesheets and (large) sets of stylesheets, a good editor lets you jump directly to definitions. Check:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Jumping to functions (including user-defined functions), templates and variables. &lt;/li&gt;
        &lt;li&gt;And because these functions, templates and variables can be defined outside the current file, i.e. in a ‘main’ file that includes other files, the editor should also be able to jump to these definitions, thus opening the appropriate file.&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;Precise XPath Error Locations&lt;/h3&gt;
        &lt;p&gt;Accurate error reporting is crucial—especially for XPath, where small mistakes can be hard to spot.&lt;/p&gt;&lt;p&gt;Check whether the editor:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Jumps to errors in included/imported stylesheets&lt;/li&gt;
        &lt;li&gt;Highlights the &lt;b&gt;exact&lt;/b&gt; position of XPath errors&lt;/li&gt;&lt;/ul&gt;
        &lt;p&gt;You can test this latest feature with &lt;a href=&quot;https://filedn.eu/l6hrQdIONMfS36XFW6FwzhS/Files/Viewing%20-%20XPath%20Error%20Location.xsl&quot;&gt;this example file&lt;/a&gt; containing XPath errors. These are the exact error locations, underlined in red:&lt;/p&gt;
        &lt;figure class=&quot;img-wrapper mid&quot;&gt;
        &lt;a href=&quot;https://www.xml.com/media/images/image3_VqBKWzp.width-1280.png&quot; target=&quot;_blank&quot;&gt;
        &lt;img src=&quot;https://www.xml.com/media/images/image3_VqBKWzp.width-1280.png&quot; alt=&quot;Error locations underlined in red&quot; width=&quot;697&quot; height=&quot;228&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
        &lt;figcaption&gt;
        Exact error locations
        &lt;/figcaption&gt;
        &lt;/figure&gt;
        &lt;h2&gt;Editing your XSLT&lt;/h2&gt;
        &lt;p&gt;Editing support determines how quickly you can write correct XSLT and XPath. Code completion is central: the editor should present only the valid options at any point.&lt;/p&gt;
        &lt;h3&gt;XSLT Syntax&lt;/h3&gt;
        &lt;p&gt;The basic support for code completion of XSLT 3.0 provides completion for all elements and attributes. An editor can help you by:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Including the semantics (i.e what it is used for).&lt;/li&gt;
        &lt;li&gt;Including code completion for both named and matched templates&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;XPath Functions&lt;/h3&gt;
        &lt;p&gt;XPath 3.1 has over 200 built in functions for string manipulation, mathematics, arrays, maps, etc. Remembering the correct name and spelling can be hard and the function names can be very long.&lt;/p&gt;
        &lt;p&gt;State of the art completion for functions, contains:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Completion for all XPath 3.1 functions, especially &lt;a href=&quot;https://www.w3.org/TR/xpath-functions/all/&quot;&gt;the 30 functions&lt;/a&gt; added within the latest 3.1 version. Try for instance the math function pi:&lt;/li&gt;
        &lt;figure class=&quot;img-wrapper mid&quot;&gt;
        &lt;a href=&quot;https://www.xml.com/media/images/image5.width-1280.png&quot; target=&quot;_blank&quot;&gt;
        &lt;img src=&quot;https://www.xml.com/media/images/image5.width-1280.png&quot; alt=&quot;Function completion&quot; width=&quot;1075&quot; height=&quot;158&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
        &lt;figcaption&gt;
        Function completion
        &lt;/figcaption&gt;
        &lt;/figure&gt;
        &lt;li&gt;Completion for user-defined XSLT functions, even when declared in included files.&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;XSLT Variables&lt;/h3&gt;
        &lt;p&gt;The scope of XSLT variables is important for correct interpretation of your code. Editors, however, can easily present either too many options or too few, thus making it unnecessarily difficult to write your code:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Does the code completion account for the difference in scope of global vs local variables, static vs non-static variables?&lt;/li&gt;&lt;/ul&gt;
        &lt;figure class=&quot;img-wrapper mid&quot;&gt;
        &lt;a href=&quot;https://www.xml.com/media/images/image2.width-1280.png&quot; target=&quot;_blank&quot;&gt;
        &lt;img src=&quot;https://www.xml.com/media/images/image2.width-1280.png&quot; alt=&quot;Variable completion&quot; width=&quot;464&quot; height=&quot;163&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;
        &lt;figcaption&gt;
        Variable completion
        &lt;/figcaption&gt;
        &lt;/figure&gt;
        &lt;p&gt;Notice that ccc is not presented in the code completion.&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Does it suggest variables declared in included and or imported files?&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;XPath 3.1 Syntax&lt;/h3&gt;
        &lt;p&gt;XPath is the most powerful part of XSLT—and the most error-prone. Quality XPath completion dramatically improves correctness.&lt;/p&gt;
        &lt;p&gt;Verify that the editor provides completion for:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;&lt;span style=&quot;color:green&quot;&gt;cast as&lt;/span&gt; expressions&lt;/li&gt;
        &lt;li&gt;arrays (&lt;span style=&quot;color:green&quot;&gt;[&amp;nbsp;]&lt;/span&gt;)&lt;/li&gt;
        &lt;li&gt;maps (&lt;span style=&quot;color:green&quot;&gt;map{…}&lt;/span&gt;)&lt;/li&gt;
        &lt;li&gt;built-in types such as &lt;span style=&quot;color:green&quot;&gt;xs:integer&lt;/span&gt;&lt;/li&gt;
        &lt;li&gt;&lt;span style=&quot;color:green&quot;&gt;operators&lt;/span&gt;, such as &lt;span style=&quot;color:green&quot;&gt;and&lt;/span&gt;, &lt;span style=&quot;color:green&quot;&gt;or&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;XPath Expressions vs XPath Patterns &lt;/h3&gt;
        &lt;p&gt;XPath expressions (xsl:template/@match) and XPath patterns (xsl:value/@select) may look alike, but the syntax is actually different.&lt;/p&gt;
        &lt;p&gt;Examples you can test:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;&amp;lt;xsl:template match=&quot;node-name() and node-name()&quot;/&amp;gt;&lt;br&gt;&lt;span style=&quot;color:green&quot;&gt;and&lt;/span&gt; is not allowed here and must not appear in completion.&lt;/li&gt;
        &lt;li&gt;&amp;lt;xsl:value-of select=&quot;node-name() and node-name()&quot;/&amp;gt;&lt;br&gt;Here &lt;span style=&quot;color:green&quot;&gt;and&lt;/span&gt; is allowed and should appear in completion.&lt;/li&gt;&lt;/ul&gt;
        &lt;h2&gt;Running your XSLT&lt;/h2&gt;
        &lt;p&gt;Running your stylesheet—executing the transformation—is the end goal of your XSLT. A good editor streamlines this process by being easy to use and supporting specific XSLT features.&lt;/p&gt;
        &lt;h3&gt;Ease of Use&lt;/h3&gt;
        &lt;p&gt;Check whether the editor:&lt;/p&gt;
        &lt;ul&gt;&lt;li&gt;Runs your XSLT when pressing a shortcut key.&lt;/li&gt;
        &lt;li&gt;Runs on unsaved files.&lt;/li&gt;
        &lt;li&gt;Is fast, even on large files and file sets&lt;/li&gt;
        &lt;li&gt;Does not flicker during transformations.&lt;/li&gt;
        &lt;li&gt;Supports using URLs as input sources (besides Windows path)&lt;/li&gt;
        &lt;li&gt;Offers multiple output options (in a browser, editor) &lt;/li&gt;
        &lt;li&gt;Offers multiple output formats (text, XML, HTML)&lt;/li&gt;
        &lt;li&gt;With included files, the editor should be able to run the top most stylesheet.&lt;/li&gt;&lt;/ul&gt;
        &lt;h3&gt;XSLT Parameters&lt;/h3&gt;
        &lt;p&gt;Your editor should have a way to recognize which parameters are mandatory and easily set these parameters before running a transformation.&lt;/p&gt;
        &lt;h3&gt;Initial Template&lt;/h3&gt;
        &lt;p&gt;XSLT 3.0 allows running a stylesheet without an input document using &lt;span style=&quot;color:green&quot;&gt;xsl:initial-template&lt;/span&gt;.&lt;br&gt;&lt;/p&gt;
        &lt;p&gt;So your editor should support this XSLT:&lt;/p&gt;
        &lt;p&gt;&amp;lt;xsl:template name=&quot;xsl:initial-template&quot;&amp;gt;&lt;/p&gt;&lt;p&gt; &amp;lt;xsl:value-of select=&quot;&#39;HELLO WORLD!&#39;&quot;/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;
        &lt;h2&gt;Current XSLT Editors Compared&lt;/h2&gt;
        &lt;p&gt;I hope I have given you a way to test whether your XSLT editor meets your needs—and perhaps I have even shown you features you didn’t know existed. &lt;/p&gt;
        &lt;p&gt;If you&#39;re interested in how the four XSLT 3.0 editors (OxygenXML, XMLSpy, XMLBlueprint, VSCode) perform against the presented criteria, please see &lt;a href=&quot;https://www.xmlblueprint.com/best-xslt-editors.htm&quot;&gt;the results of my comparison&lt;/a&gt;.&lt;/p&gt;
        &lt;p&gt;Please let me know if you have additional features that would make your XSLT editing faster, easier or more correct.&lt;/p&gt;
      </description>
      <link>https://www.xml.com/articles/2025/12/31/evaluate-xslt-editor/</link>
      <guid isPermaLink="false">https://www.xml.com/articles/2025/12/31/evaluate-xslt-editor/</guid>
      <pubDate>Wed, 31 Dec 2025 17:02:29 GMT</pubDate>
      <author>Gerben Abbink</author>
      <category>xslt</category>
      <category>editor</category>
      <category>xslt3</category>
    </item>
    <item>
      <title>Writing Invisible XML Grammars</title>
      <description>&lt;div class=&quot;list-of-titles&quot;&gt;&lt;div class=&quot;lot toc&quot;&gt;&lt;div class=&quot;title&quot;&gt;Table of Contents&lt;/div&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#intro&quot;&gt;1.&amp;nbsp;Introduction&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#playalong&quot;&gt;1.1.&amp;nbsp;Play along at home!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#howtoread&quot;&gt;1.2.&amp;nbsp;Input or output?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#input&quot;&gt;2.&amp;nbsp;The input&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#rules&quot;&gt;2.1.&amp;nbsp;Rules&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#rhs&quot;&gt;2.2.&amp;nbsp;Organizing the “right hand side”&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#literals&quot;&gt;2.3.&amp;nbsp;Matching literal characters&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#strings&quot;&gt;2.3.1.&amp;nbsp;Matching strings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#encoded&quot;&gt;2.3.2.&amp;nbsp;Matching individual characters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#sets&quot;&gt;2.3.3.&amp;nbsp;Character sets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#seq&quot;&gt;2.4.&amp;nbsp;Matching sequences&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#names-ws&quot;&gt;2.5.&amp;nbsp;Matching names and whitespace&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#names&quot;&gt;2.5.1.&amp;nbsp;Matching names&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#whitespace&quot;&gt;2.5.2.&amp;nbsp;Matching whitespace&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#ambiguity&quot;&gt;2.6.&amp;nbsp;Ambiguity&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#epsilon&quot;&gt;2.6.1.&amp;nbsp;Matching nothing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#nonxml&quot;&gt;2.7.&amp;nbsp;Non-XML characters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#insertions&quot;&gt;2.8.&amp;nbsp;Insertions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#renaming&quot;&gt;2.9.&amp;nbsp;Renaming&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#output&quot;&gt;3.&amp;nbsp;The output&lt;/a&gt;&lt;ul class=&quot;toc&quot;&gt;&lt;li&gt;&lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#cant&quot;&gt;3.1.&amp;nbsp;What you can’t do&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;db-bfs&quot;&gt;&lt;p&gt;This article is a follow-up to the introduction to
        &lt;a href=&quot;https://www.xml.com/articles/2022/03/01/invisible-xml/&quot; class=&quot;link&quot;&gt;Invisible XML&lt;/a&gt; published
        at &lt;a href=&quot;https://www.xml.com/&quot; class=&quot;link&quot;&gt;XML.com&lt;/a&gt; on 1&amp;nbsp;March&amp;nbsp;2022 (and
        &lt;a href=&quot;https://www.xml.com/articles/2025/12/02/invisible-xml-update/&quot;&gt;slightly revised&lt;/a&gt; in November, 2025).&lt;/p&gt;&lt;p&gt;This article was revised in November, 2025 to include the following corrections
        and additions:&lt;/p&gt;&lt;ul class=&quot;itemizedlist&quot;&gt;&lt;li&gt;The syntax for repetition changed after the original publication.
        Where previously “*” and “+” were the repetition separators, those are now “**” and “++”.
        &lt;/li&gt;&lt;li&gt;A new section has been added to describe the insertions feature that was
        added to the 1.0 specification after the original publication of this article.
        &lt;/li&gt;&lt;li&gt;A new section has been added to describe the renaming feature.
        This feature has been accepted by the Community Group, and appears in several implementations,
        but is not yet part of the officially published specification.
        &lt;/li&gt;&lt;li&gt;Finally, there are minor changes to examples and outputs as many tools have evolved.
        &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This article focuses on the syntax of Invisible XML documents and how
        to write (and debug) grammars. If you’re not already familiar with the principles
        behind Invisible XML, you may want to read the introductory article first.&lt;/p&gt;&lt;/div&gt;
        &lt;section id=&quot;intro&quot;&gt;&lt;header&gt;&lt;h2&gt;1.&amp;nbsp;&amp;nbsp;Introduction&lt;/h2&gt;&lt;/header&gt;&lt;p&gt;If you’re familiar with writing grammars in any
        &lt;a href=&quot;https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form&quot; class=&quot;link&quot;&gt;BNF&lt;/a&gt;
        (or &lt;a href=&quot;https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form&quot; class=&quot;link&quot;&gt;EBNF&lt;/a&gt;) form,
        you’ll find Invisible XML easy to use. If you’ve never written a
        grammar like this before, you’re in for a treat, this is fun!&lt;/p&gt;&lt;p&gt;You’ll soon discover that writing an Invisible XML grammar
        shares a lot with writing an XML schema (defining a hierarchy of symbols) or a regular
        expression (figuring out how to match an item and what to replace it with).
        As we said last time, a &lt;b class=&quot;firstterm&quot;&gt;grammar&lt;/b&gt; is a
        collection of rules. Each rule has a “left hand side” and a “right
        hand side”. The left hand side is a single symbol, the one being
        defined, and the right hand side is a list of symbols that
        define it. A &lt;b class=&quot;firstterm&quot;&gt;symbol&lt;/b&gt; is either the name of
        a symbol, in which case there must be a further rule that defines it,
        or it’s something that
        literally matches characters in your input.&lt;/p&gt;&lt;p&gt;This article describes the syntax of Invisible XML as published in the specification of 10 June 2022. In the event that the community group
        introduces grammar changes, we’ll try to make sure this article stays up-to-date, or publish a new version.&lt;/p&gt;
        &lt;p&gt;Invisible XML is defined by an Invisible XML grammar. It is an
        instance of itself. The
        &lt;a href=&quot;https://invisiblexml.org/ixml-specification.html#complete&quot; class=&quot;link&quot;&gt;complete
        grammar&lt;/a&gt; is only about 45 rules. Printed, it would fit on one side
        of a sheet of standard office paper.&lt;/p&gt;&lt;p&gt;Let’s dig in. We’re going to bounce around a little bit at
        first, but eventually we’ll settle in to writing some longer, less
        contrived grammars.&lt;/p&gt;
        &lt;section id=&quot;playalong&quot;&gt;&lt;header&gt;&lt;h3&gt;1.1.&amp;nbsp;&amp;nbsp;Play along at home!&lt;/h3&gt;&lt;/header&gt;&lt;p&gt;As you read this article and look at the examples it contains,
        we encourage you to play along at home. You’ll learn a lot from trying
        out the examples! As you learn new concepts, extend the examples and
        try matching your own inputs.&lt;/p&gt;&lt;p&gt;For an even more interactive introduction to Invisible XML, check out
        &lt;span class=&quot;first-last personname&quot;&gt;John Lumley&lt;/span&gt;’s
        &lt;a href=&quot;https://johnlumley.github.io/jwiXML.xhtml&quot; class=&quot;link&quot;&gt;jωiXML workbench&lt;/a&gt;.
        Alternatively, you can download &lt;a href=&quot;https://coffeepot.nineml.org/&quot; class=&quot;link&quot;&gt;CoffeePot&lt;/a&gt;, a command line
        Invisible XML processor that’s part of the &lt;a href=&quot;https://nineml.org/&quot; class=&quot;link&quot;&gt;NineML&lt;/a&gt; family of Invisible XML tools.
        (It’s a Java application and should run easily on Linux, MacOS, and Windows
        computers.) For a list of other processors, see the
        &lt;a href=&quot;https://invisiblexml.org/&quot; class=&quot;link&quot;&gt;Invisible XML homepage&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;
        &lt;section id=&quot;howtoread&quot;&gt;&lt;header&gt;&lt;h3&gt;1.2.&amp;nbsp;&amp;nbsp;Input or output?&lt;/h3&gt;&lt;/header&gt;&lt;p&gt;Writing grammars is about creating rules that match against
        things in the input. Those rules are, in turn, used to create XML elements
        and attributes that will appear in the output. These aren’t completely
        independent. Annotations that you put in the grammar will influence
        how the XML is created.&lt;/p&gt;&lt;p&gt;In this article, we’ve organized the two sections separately.
        First, we’ll look at the input, and then we’ll talk about the output.
        If you’re working through examples and starting to experiment with
        grammars on your own, you may want to know something about the output
        sooner rather than later. Feel free to skip back and forth. If you’ve never
        written grammars of this type before, do read the first
        few sections of “The input” about rules and matching first.&lt;/p&gt;&lt;p&gt;Bear in mind as you go that the goal of Invisible XML is to produce “visible XML”.
        That’s not necessarily the final output form that you want. It’s “text to XML”, not
        “text to DocBook 5.2 with embedded MathML and SVG.” There are other, better tools to
        transform one flavor of XML into another, Invisible XML doesn’t have to do &lt;em&gt;all&lt;/em&gt;
        the lifting.&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
        &lt;header id=&quot;input&quot;&gt;&lt;h2&gt;2.&amp;nbsp;&amp;nbsp;The input&lt;/h2&gt;&lt;/header&gt;&lt;p&gt;Before we begin looking at rules, we need to think about what is being
        processed by them. If you have any experience with parsing technologies, you
        may be used to the idea that processing an input has two phases: a lexical
        analysis phase (“the lexer”) and a parsing phase (“the parser”).&lt;/p&gt;&lt;p&gt;The lexer decides what parts of the input are the actual tokens.
        It might remove insignificant whitespace, strip out comments,
        normalize strings, etc. The parser then operates on those tokens.
        The lexer does a lot of important work and the lexer for one kind of parsing
        (Java, for example) simply won’t work for another kind (Python, for example).
        &lt;/p&gt;&lt;p&gt;If Invisible XML was going to work this way, it would have to
        provide two sets of rules, one for lexing and one for parsing. That
        would add all kinds of complexity to the language. Instead, Invisible
        XML has the simplest possible lexer: your input string becomes a
        sequence of characters.&lt;/p&gt;&lt;p&gt;What you’re matching in rules are the individual characters of
        the input: every single one of them. This is one of the reasons that writing an
        Invisible XML grammar feels a little bit like writing a regular expression.
        As we’ll see, this makes some things a little more complicated, but overall
        it greatly simplifies Invisible XML.&lt;/p&gt;
        &lt;header id=&quot;rules&quot;&gt;&lt;h3&gt;2.1.&amp;nbsp;&amp;nbsp;Rules&lt;/h3&gt;&lt;/header&gt;&lt;p&gt;A rule has the form of a name (the left hand side) followed by a
        colon, followed by &lt;a href=&quot;https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#epsilon&quot; class=&quot;link&quot;&gt;zero&lt;/a&gt; or more symbols
        (the right hand side) followed by a full stop to end the rule. If more
        than one symbol appears on the right hand side, they must be separated
        by commas:&lt;/p&gt;
        &lt;div class=&quot;codehighlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;symbol-name &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; defining, symbols, here .
        &lt;/pre&gt;&lt;/div&gt;
        &lt;p&gt;Invisible XML allows only a single rule for any given name. If
        you want to express that a symbol can have two or more definitions,
        separate the alternatives with semicolons. This rule says that a
        “&lt;code&gt;thing&lt;/code&gt;” is a “&lt;code&gt;this&lt;/code&gt;”, followed by a
        “&lt;code&gt;that&lt;/code&gt;”:&lt;/p&gt;
        &lt;div class=&quot;codehighlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;thing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; this, that .
        &lt;/pre&gt;&lt;/div&gt;
        &lt;p&gt;This rule says that a “&lt;code&gt;thing&lt;/code&gt;” is a “&lt;code&gt;this&lt;/code&gt;&lt;em&gt;or&lt;/em&gt;
        a “&lt;code&gt;that&lt;/code&gt;”:&lt;/p&gt;
        &lt;div class=&quot;codehighlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;thing&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; this &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; that .
        &lt;/pre&gt;&lt;/div&gt;
        &lt;p&gt;Whitespace around the punctuation is insignificant,
        “&lt;code&gt;this;that&lt;/code&gt;” is the same as “&lt;code&gt;this; that&lt;/code&gt;” is
        the same as “&lt;code&gt;this ; that&lt;/code&gt;”. That’s true of all the rule
        punctuation except that there must be at least one whitspace character between
        consecutive rules.&lt;/p&gt;&lt;div class=&quot;admonition note&quot;&gt;&lt;div&gt;&lt;div class=&quot;icon&quot;&gt;&lt;/div&gt;&lt;div class=&quot;body&quot;&gt;&lt;header&gt;&lt;div class=&quot;title&quot;&gt;&lt;b&gt;Note&lt;/b&gt;&lt;/div&gt;&lt;/header&gt;&lt;div&gt;&lt;p&gt;Speaking of insignificant differences, Invisible XML allows
        either of two separators between the left- and right-hand sides of a
        rule: colon (“:”) or equals (“=”). Likewise, it allows either of two
        separators to mark alternatives: semicolon (“;”) or vertical line
        (“|”). In this article, I will consistently use “=” and “|” (except where I’m
        quoting the iXML grammar itself), but you’re
        free to use “:” and “;” if you find them easier to read or remember.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Most grammars contain more than one rule. Rules are
        separated by whitespace. It’s good practice, simply for readability,
        to start each rule on its own line, but it’s not strictly required.&lt;/p&gt;
        &lt;header id=&quot;rhs&quot;&gt;&lt;h3&gt;2.2.&amp;nbsp;Organizing the “right hand side”&lt;/h3&gt;&lt;/header&gt;&lt;p&gt;The Invisible XML specification introduces a few nonterminals
        (remember, Invisible XML is defined in Invisible XML!) to organize how
        we think about the symbols that appear on the right hand side of a
        rule. It will be convenient later to talk about how these are
        combined, so let’s take a moment to lay out some vocabulary.&lt;/p&gt;&lt;p&gt;At the highest level, what appears on the right hands side of a
        rule is a series of alternatives. A series of alternatives
        is composed of one or more individual &lt;em&gt;alternatives&lt;/em&gt;
        separated from each other by “;” (or “|”). Each alternative
        is composed of a series of &lt;em&gt;terms&lt;/em&gt; separated by “,”. A
        term is composed of &lt;em&gt;factors&lt;/em&gt;. A factor is either
        a terminal; a nonterminal; or another set of alternatives surrounded
        by parentheses. In other words, like content models or regular expressions, you can
        put parentheses around a set of alternatives and then use that group as
        a factor, a part of another grouping.
        &lt;/p&gt;&lt;p&gt;For example, in the following rule:&lt;/p&gt;
        &lt;div class=&quot;codehighlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;memo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; recipient, &lt;span class=&

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto: ready to review Human review will come in after lint issues and merge conflicts are fixed route

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant