Conversation
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.
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><p>EditiX XML Editor 2027 is now available.</p>
<p>EditiX is an open-source, cross-platform XML editor and development environment for working with XML, XSLT, XQuery, XPath and XML Schema.</p>
<p>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...</p>
<p>More information about EditiX 2027:<br><a href="https://www.editix.com/news2027.html?utm_source=chatgpt.com">https://www.editix.com/news2027.html</a></p>
<p>&nbsp;</p>
</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><p>For readers new to Expat:</p>
<p><a href="https://libexpat.github.io/">libexpat</a> is a fast streaming XML parser. Alongside libxml2, Expat is one of the <a href="https://libexpat.github.io/doc/users/">most widely used</a> software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under <a href="https://opensource.org/licenses/MIT">the MIT license</a>.</p>
<p><a href="https://github.com/libexpat/libexpat/releases/tag/R_2_8_4">Expat 2.8.4</a> was released a few hours ago. The key motivation for cutting a release and doing so now was getting the fixes to four vulnerabilities…</p>
<ul>
<li><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-66046">CVE-2026-66046</a></li>
<li><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-76641">CVE-2026-76641</a></li>
<li><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-76956">CVE-2026-76956</a></li>
<li><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-76957">CVE-2026-76957</a></li>
</ul>
<p>…into the hands of the community.</p>
<p>The vulnerabilities were reported by <a href="https://github.com/carrerasdarren-cell">Darren Carreras</a>, <a href="https://github.com/fabwa">Fabian Wahle (Hap Security)</a>, <a href="https://github.com/Sorrashut-K">Sorrashut Kaewtaworn</a>, <a href="https://github.com/liuzeyouzeyou">Zeyou Liu</a>, and the fixing was done by <a href="https://github.com/carrerasdarren-cell">Darren Carreras</a>, <a href="https://github.com/Sorrashut-K">Sorrashut Kaewtaworn</a>, <a href="https://github.com/liuzeyouzeyou">Zeyou Liu</a>, and <a href="https://github.com/hartwork">me</a> — thank you!</p>
<p>Issue <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-66046">CVE-2026-66046</a> is worth illustrating, and the <a href="https://github.com/libexpat/libexpat/pull/1321">fixing pull request</a> contains an attack payload generator in <a href="https://github.com/libexpat/libexpat/pull/1321">its description</a>. The issue was that if an attacker dials up a document like…</p>
<p>&lt;!DOCTYPE e [ &lt;!ATTLIST e a0 NMTOKEN "x"&gt; &lt;!ATTLIST e a1 NMTOKEN "x"&gt; &lt;!ATTLIST e a2 NMTOKEN "x"&gt; ]&gt; &lt;e a0=" v " a1=" v " a2=" v " /&gt;</p>
<p>…from 3 attributes to thousands, they could leverage the now-past quadratic runtime nature of Expat's related machinery to cause <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack">denial of service</a> even with moderatly sized payload. The fix was migrating from an <code>O(n)</code> loop to an <a href="https://en.wikipedia.org/wiki/Amortized_analysis">amortized <code>O(1)</code></a> <a href="https://en.wikipedia.org/wiki/Hash_table">hash table lookup</a>.</p>
<p>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 <a href="https://fil-c.org/">Fil-C</a>, <a href="https://en.wikipedia.org/wiki/RISC-V">RISC-V</a>, <a href="https://github.com/mstorsjo/llvm-mingw">Clang-based MinGW</a>, and (the <a href="https://en.wikipedia.org/wiki/Endianness">big-endian</a> architecture) <a href="https://en.wikipedia.org/wiki/IBM_System/390">s390x</a> for the first time.</p>
<p>It should be noted that it was the <a href="https://blog.hartwork.org/posts/libexpat-city-of-munich-open-source-sabbatical/">Open Source Sabbatical of the City of Munich</a> 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 <a href="https://github.com/libexpat/libexpat/issues/1160">plenty to do</a>. Wish me luck!</p>
<p>Thanks to everyone who contributed to this release of Expat!</p>
<p>For more details about this release, please <a href="https://github.com/libexpat/libexpat/blob/R_2_8_4/expat/Changes">check out the change log</a>.</p>
<p>If <em>you</em> maintain Expat packaging, a bundled copy of Expat, or a pinned version of Expat, please update to version 2.8.4. Thank you!</p>
<p>Sebastian Pipping</p>
<p>This article first appeared at <a href="https://blog.hartwork.org/posts/expat-2-8-4-released/">blog.hartwork.org</a>.</p>
</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><p>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 <strong>to protect, promote, and advance Extensible Markup Language (XML) and related technologies, and to cultivate a diverse and international community of practitioners</strong>.&nbsp;</p>
<p><strong>Invitees</strong>: 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.&nbsp;</p>
<p><strong>Date</strong>: Friday, September 25, 2026</p>
<p><strong>Time</strong>: 15:00 - 17:00 Coordinated Universal Time&nbsp;</p>
<p>Convert to a local time here: https://www.timeanddate.com/worldclock/fixedtime.html?iso=20260925T15&amp;p1=1440</p>
<p>(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)</p>
<p><strong>Venue</strong>:&nbsp;</p>
<p>https://psu.zoom.us/j/96781675161?pwd=Jb8VebO7b1RED8a7gqOEakJBPU1VrC.1&nbsp;</p>
<p>Password: 10xml10</p>
<p>Meeting ID: 967 8167 5161</p>
<p>Any changes to the meeting details will be announced at the listserv.&nbsp;</p>
<p><strong>Listserv details</strong>:&nbsp;</p>
<ul>
<li>Request to join: https://lists.psu.edu/cgi-bin/wa?SUBED1=IOXML-L&amp;A=1&nbsp;</li>
<li>List Address: IOXML-L@LISTS.PSU.EDU</li>
<li>Archives: https://lists.psu.edu/cgi-bin/wa?A0=IOXML-L</li>
<li>List Owners: IOXML-L-request@LISTS.PSU.EDU</li>
<li>Unsubscribe: IOXML-L-signoff-request@LISTS.PSU.EDU</li>
</ul>
<p>You can join the list by request (to be approved by the list owners).</p>
</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><p>For readers new to Expat:</p>
<p><a href="https://libexpat.github.io/">libexpat</a> is a fast streaming XML parser. Alongside libxml2, Expat is one of the <a href="https://libexpat.github.io/doc/users/">most widely used</a> software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under <a href="https://opensource.org/licenses/MIT">the MIT license</a>.</p>
<p><a href="https://github.com/libexpat/libexpat/releases/tag/R_2_8_2">Expat 2.8.3</a> was released yesterday. The key motivation for cutting a release and doing so now was getting…</p>
<ul>
<li>the fix to vulnerability <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-72522">CVE-2026-72522</a> as well as</li>
<li>the fix to a regression in Expat 2.8.2</li>
</ul>
<p>…out to users.</p>
<p>The vulnerability was reported by the Mozilla Security Team, and it relates to how Expat handles decoding of <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a>. The vulnerability is technically an <a href="https://cwe.mitre.org/data/definitions/125.html">out-of-bounds read</a>, and the symptom in practice is (easy and reliable) <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack">denial of service</a> by means of an infinite loop. It should be noted that the CVSS vector by Mitre for <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-72522">CVE-2026-72522</a> in the <a href="https://nvd.nist.gov/">National Vulnerability Database</a> is (once again) misclassifying the attack vector as <code>Local (L)</code> when it should be <code>Network (N)</code>: there are no requirements for <a href="https://www.first.org/cvss/v3.1/specification-document#2-1-Exploitability-Metrics">local access</a> with <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-72522">CVE-2026-72522</a>.</p>
<p>The regression was that on 32bit platforms and on 64bit Windows, processing XML content of 2+ GiB size <a href="https://github.com/libexpat/libexpat/issues/1297">was rejected as "out of memory" by mistake</a>. The issue was reported by <a href="https://github.com/evgenykotkov">Evgeny Kotkov</a> a week ago in the context of Subversion's use of libexpat.</p>
<p>Thanks to everyone who contributed to this release of Expat!</p>
<p>For more details about this release, please <a href="https://github.com/libexpat/libexpat/blob/R_2_8_3/expat/Changes">check out the change log</a>.</p>
<p>If <em>you</em> maintain Expat packaging, a bundled copy of Expat, or a pinned version of Expat, please update to version 2.8.3. Thank you!</p>
<p>Sebastian Pipping</p>
<p>This article first appeared at <a href="https://blog.hartwork.org/posts/expat-2-8-3-released/">blog.hartwork.org</a>.</p>
<p>&nbsp;</p>
</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><p>For readers new to Expat:</p>
<p><a href="https://libexpat.github.io/">libexpat</a> is a fast streaming XML parser. Alongside libxml2, Expat is one of the <a href="https://libexpat.github.io/doc/users/">most widely used</a> software libre XML parsers written in C, specifically C99. It is cross-platform and licensed under <a href="https://opensource.org/licenses/MIT">the MIT license</a>.</p>
<p>Starting 2026-08-01, the <a href="https://github.com/libexpat/libexpat/issues/1277">"security vacation" of the project</a> has ended and(!) I will be paid to work on maintaining libexpat for up to 6 months thanks to the <a href="https://en.wikipedia.org/wiki/Munich">City of Munich</a> under the umbrella of their <a href="https://opensource.muenchen.de/software/libexpat.html#open-source-sabbatical">Open Source Sabbatical</a> program.<br>What does that mean?</p>
<p>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 "regular job" for a limited period of time. My top priorities will be:</p>
<ul>
<li>
<p>Fixing the <a href="https://github.com/libexpat/libexpat/issues/1160">currently 5 known unfixed vulnerabilities</a></p>
</li>
<li>
<p>Adding <a href="https://github.com/libexpat/libexpat/issues/171">support for XML 1.0r5</a></p>
</li>
<li>
<p>Further improving the robustness and maintainability of the project</p>
</li>
</ul>
<p>Yesterday and today most of my time went into fixing a <a href="https://github.com/libexpat/libexpat/pull/1296">vulnerability uncovered by Mozilla</a>.</p>
<p>Technically, I am being employed by <a href="https://digital-at-m.de/">digitial@M</a> now for of up 6 months with a regular working contract, including cancellation by either party, remotely from home. There is plenty to do.</p>
<p>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 <a href="mailto:sebastian@pipping.org">send them my way</a>, the coming months will be the best chance at getting things fixed in reasonable time. <a href="https://en.wikipedia.org/wiki/Queueing_theory">Queueing theory</a> and laws of physics still apply.</p>
<p>Wish me luck!</p>
<p>Best, Sebastian</p>
<p>This article first appeared at <a href="https://blog.hartwork.org/posts/libexpat-city-of-munich-open-source-sabbatical/">blog.hartwork.org</a>.</p>
</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><p>The pre-conference edition of the <strong>B</strong>alisage 2026 Proceedings is now available:&nbsp;<br>&nbsp; &nbsp;<a href="https://www.balisage.net/Proceedings/vol31/contents.html">https://www.balisage.net/Proceedings/vol31/contents.html</a></p>
<p><br>After the conference these proceedings will be enhanced with speakers' slides, corrections to papers, and (probably) a few more papers.<br><br>Balisage 2026 is <strong>next week</strong>!<br><br></p>
<p>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 <strong>all virtual</strong>, so you can come for the parts that catch your interest. Register for a day, two days, or the whole week!<br><br>Registration: &nbsp;<a href="https://balisage.net/registration.html">https://balisage.net/registration.html</a></p>
<p>Conference overview: <a href="https://balisage.net/">https://balisage.net/</a></p>
<p>&nbsp;</p>
<p>Note: if your registration is not acknowledged within 24 hours please send email to btusdin@mulberrytech.com<br><br>Questions: <a href="mailto:info@balisage.net">info@balisage.net</a></p>
</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><p>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.<br><br>The series of conversations will take the title "The Future of Markup", and each conversation will have a theme, the first being "An International Organization for XML?" 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 "The Future of Markup" conversation.<br><br>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 <a href="mailto:info@balisage.net">info@balisage.net</a>.<br><br>About Balisage: <a href="https://www.balisage.net/index.html">https://www.balisage.net/index.html</a><br>Registration: <a href="https://www.balisage.net/registration.html">https://www.balisage.net/registration.html</a></p>
</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><p>We are delighted to announce that Elemental versions 6.11.0 and 7.7.0 have just been released.</p>
<p>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.<br><br>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:<br><br>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.<br><br>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.</p>
<p>The releases are available from:</p>
<ul>
<li><a href="https://github.com/evolvedbinary/elemental/releases/tag/elemental-6.11.0">https://github.com/evolvedbinary/elemental/releases/tag/elemental-6.11.0</a></li>
<li><a href="https://github.com/evolvedbinary/elemental/releases/tag/elemental-7.7.0">https://github.com/evolvedbinary/elemental/releases/tag/elemental-7.7.0</a></li>
</ul>
<h3><br>Features</h3>
<ol>
<li>
<p>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 - <a href="https://github.com/evolvedbinary/elemental/pull/224">#264</a><br><br></p>
</li>
<li>
<p>&nbsp;</p>
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 - <a href="https://github.com/evolvedbinary/elemental/pull/229">#229</a></li>
<li>
<p>Added a new <code>system:get-main-module-load-path()</code> XPath function to restore compatibility with TEI-Publisher - <a href="https://github.com/evolvedbinary/elemental/pull/231">#231</a></p>
</li>
</ol>
<h3>Bug Fixes</h3>
<ol>
<li>Restore support for oXygen XML Editor - <a href="https://github.com/evolvedbinary/elemental/pull/215">#215</a><br><br></li>
<li>Ensure that the Base URI is always a valid URI; relative XSLT imports from XSLT documents stored in the database now resolve correctly - <a href="https://github.com/evolvedbinary/elemental/pull/219">#219</a><br><br></li>
<li>Ensure that the Base URI of in-memory documents is set correctly - <a href="https://github.com/evolvedbinary/elemental/pull/204">#204</a><br><br></li>
<li>Set the HTTP Response Content-Type when writing JSON results from the REST API - <a href="https://github.com/evolvedbinary/elemental/pull/212">#212</a><br><br></li>
<li>Improve the resolution and loading of configuration files on Windows platforms - <a href="https://github.com/evolvedbinary/elemental/pull/216">#216</a></li>
</ol>
<p>&nbsp;</p>
<h3>Backwards Compatibility</h3>
<ul>
<li>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.</li>
<li>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.</li>
</ul>
<p>Further information and downloads can be found here: <a href="https://github.com/evolvedbinary/elemental/releases">https://github.com/evolvedbinary/elemental/releases</a></p>
<p>&nbsp;</p>
</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><p>We are happy to annouce that Fore 4.0.0 has been released.&nbsp;</p>
<p>It offers major improvments:<br>* substancial performance enhancements</p>
<p>* undo/redo capability</p>
<p>* progressive + virtualized repeats for fast-loading big repeated datasets</p>
<p>* a 20% reduced bundle</p>
<p>* WCAG accessibility reports, mostly implemented with details on implementation</p>
<p>* a minimap for navigating big pages</p>
<p>* many bugfixes and new tests</p>
<p>It can be downloaded from https://github.com/jinntec/fore. Online demos are here: https://jinntec.github.io/Fore/doc/demos.html</p>
<p>&nbsp;</p>
</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><p>The <a href="https://balisage.net/2026/Program.html">Balisage 2026 program</a> 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<br><br>Balisage 2026 will be:</p>
<ul>
<li>All virtual</li>
<li>Interactive</li>
<li>Live</li>
<li>The last Balisage Conference</li>
<li>3 – 7 August 2026</li>
</ul>
<p><br><br>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.<br><br>The Birds of a Feather sessions will include a series of conversations devoted to the future of markup.</p>
</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><p><i>“XSLT (Extensible Stylesheet Language Transformations) remains one of the most capable—and most underestimated—technologies for transforming structured content.”</i> (Vasu Chakkera, 2025). </p>
<p>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: <a href="https://www.xml.com/articles/2017/02/14/why-you-should-be-using-xslt-30/">Why You Should Be Using XSLT 3.0</a>).</p>
<p>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.</p>
<p>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. </p><p>I have based the criteria on the W3C specifications for <a href="https://www.w3.org/TR/xslt/">XSLT</a> and <a href="https://www.w3.org/TR/xpath/">XPath</a> —after all, the primary task of an editor is to help you produce code that conforms to those standards.</p>
<p>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.</p>
<h2>Support for the Latest Standards</h2>
<p>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). </p>
<h2>Viewing your XSLT</h2>
<p>Even before editing or executing a transformation, an editor has several ways to help you understand your code.</p>
<h3>Syntax Coloring</h3>
<p>Good syntax coloring improves readability by distinguishing the structural components of XSLT and XPath.</p>
<p>Is the coloring correct according to the XSLT and XPath grammar?<br>To test correctness, try expressions that mix names and operators:</p>
<p><code>&lt;xsl:value-of select="and and and and and"/&gt;</code></p>
<p>Correct coloring should distinguish <b><span style="color:darkgreen">and</span></b> <b>as a name</b> from <b><span style="color:darkgreen">and</span></b> <b>as a boolean operator</b> (see XPath <a href="https://www.w3.org/TR/xpath-31/#doc-xpath31-AndExpr">AndExpr</a> and <a href="https://www.w3.org/TR/xpath-31/%23doc-xpath31-NameTest">NameTest</a>). So the correct coloring would be:</p>
<p>&lt;xsl:value-of select="and <span style="color:green">and</span> and <span style="color:green">and</span> and”/&gt;</p>
<p>Other examples to test:</p>
<ul>
<li>&lt;xsl:value-of select="<span style="color:darkgreen">gt</span> <span style="color:lightgreen">gt</span> <span style="color:green">gt</span> gt gt gt gt gt gt"/&gt;</li>
<li>&lt;xsl:value-of select="<span style="color: lightgreen">123</span> <span style="color:green">treat as</span> xs:integer + <span style="color:green">+</span> <span style="color: lightgreen">+ 3</span>"/&gt;</li>
</ul>
<h3>Tooltips</h3>
<p>Tooltips help you understand XPath expressions quickly by showing inline documentation—ideally with syntax coloring and hyperlinks.</p>
<figure class="img-wrapper mid">
<a href="https://www.xml.com/media/images/image1.width-1280.png" target="_blank">
<img src="https://www.xml.com/media/images/image1.width-1280.png" alt="Tooltip from Oxygen" width="1048" height="389" referrerpolicy="no-referrer"></a>
<figcaption>
Example tooltip on a function from Oxygen
</figcaption>
</figure>
<p>Evaluate:</p>
<ul><li>Are the tooltips clear and readable?</li>
<li>Do they include syntax coloring?</li>
<li>Are there links to documentation?</li>
<li>Do they appear for <i>all</i> XPath components?</li></ul>
<figure class="img-wrapper mid">
<a href="https://www.xml.com/media/images/image4_TZxlfL1.width-1280.png" target="_blank">
<img src="https://www.xml.com/media/images/image4_TZxlfL1.width-1280.png" alt="Pi function operator" width="1086" height="140" referrerpolicy="no-referrer"></a>
<figcaption>
Example tooltip on an operator from XMLBlueprint
</figcaption>
</figure>
<h3>Jump-to-Definition</h3>
<p>To save time navigating larger stylesheets and (large) sets of stylesheets, a good editor lets you jump directly to definitions. Check:</p>
<ul><li>Jumping to functions (including user-defined functions), templates and variables. </li>
<li>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.</li></ul>
<h3>Precise XPath Error Locations</h3>
<p>Accurate error reporting is crucial—especially for XPath, where small mistakes can be hard to spot.</p><p>Check whether the editor:</p>
<ul><li>Jumps to errors in included/imported stylesheets</li>
<li>Highlights the <b>exact</b> position of XPath errors</li></ul>
<p>You can test this latest feature with <a href="https://filedn.eu/l6hrQdIONMfS36XFW6FwzhS/Files/Viewing%20-%20XPath%20Error%20Location.xsl">this example file</a> containing XPath errors. These are the exact error locations, underlined in red:</p>
<figure class="img-wrapper mid">
<a href="https://www.xml.com/media/images/image3_VqBKWzp.width-1280.png" target="_blank">
<img src="https://www.xml.com/media/images/image3_VqBKWzp.width-1280.png" alt="Error locations underlined in red" width="697" height="228" referrerpolicy="no-referrer"></a>
<figcaption>
Exact error locations
</figcaption>
</figure>
<h2>Editing your XSLT</h2>
<p>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.</p>
<h3>XSLT Syntax</h3>
<p>The basic support for code completion of XSLT 3.0 provides completion for all elements and attributes. An editor can help you by:</p><ul><li>Including the semantics (i.e what it is used for).</li>
<li>Including code completion for both named and matched templates</li></ul>
<h3>XPath Functions</h3>
<p>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.</p>
<p>State of the art completion for functions, contains:</p>
<ul><li>Completion for all XPath 3.1 functions, especially <a href="https://www.w3.org/TR/xpath-functions/all/">the 30 functions</a> added within the latest 3.1 version. Try for instance the math function pi:</li>
<figure class="img-wrapper mid">
<a href="https://www.xml.com/media/images/image5.width-1280.png" target="_blank">
<img src="https://www.xml.com/media/images/image5.width-1280.png" alt="Function completion" width="1075" height="158" referrerpolicy="no-referrer"></a>
<figcaption>
Function completion
</figcaption>
</figure>
<li>Completion for user-defined XSLT functions, even when declared in included files.</li></ul>
<h3>XSLT Variables</h3>
<p>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:</p>
<ul><li>Does the code completion account for the difference in scope of global vs local variables, static vs non-static variables?</li></ul>
<figure class="img-wrapper mid">
<a href="https://www.xml.com/media/images/image2.width-1280.png" target="_blank">
<img src="https://www.xml.com/media/images/image2.width-1280.png" alt="Variable completion" width="464" height="163" referrerpolicy="no-referrer"></a>
<figcaption>
Variable completion
</figcaption>
</figure>
<p>Notice that ccc is not presented in the code completion.</p>
<ul><li>Does it suggest variables declared in included and or imported files?</li></ul>
<h3>XPath 3.1 Syntax</h3>
<p>XPath is the most powerful part of XSLT—and the most error-prone. Quality XPath completion dramatically improves correctness.</p>
<p>Verify that the editor provides completion for:</p>
<ul><li><span style="color:green">cast as</span> expressions</li>
<li>arrays (<span style="color:green">[&nbsp;]</span>)</li>
<li>maps (<span style="color:green">map{…}</span>)</li>
<li>built-in types such as <span style="color:green">xs:integer</span></li>
<li><span style="color:green">operators</span>, such as <span style="color:green">and</span>, <span style="color:green">or</span></li></ul>
<h3>XPath Expressions vs XPath Patterns </h3>
<p>XPath expressions (xsl:template/@match) and XPath patterns (xsl:value/@select) may look alike, but the syntax is actually different.</p>
<p>Examples you can test:</p>
<ul><li>&lt;xsl:template match="node-name() and node-name()"/&gt;<br><span style="color:green">and</span> is not allowed here and must not appear in completion.</li>
<li>&lt;xsl:value-of select="node-name() and node-name()"/&gt;<br>Here <span style="color:green">and</span> is allowed and should appear in completion.</li></ul>
<h2>Running your XSLT</h2>
<p>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.</p>
<h3>Ease of Use</h3>
<p>Check whether the editor:</p>
<ul><li>Runs your XSLT when pressing a shortcut key.</li>
<li>Runs on unsaved files.</li>
<li>Is fast, even on large files and file sets</li>
<li>Does not flicker during transformations.</li>
<li>Supports using URLs as input sources (besides Windows path)</li>
<li>Offers multiple output options (in a browser, editor) </li>
<li>Offers multiple output formats (text, XML, HTML)</li>
<li>With included files, the editor should be able to run the top most stylesheet.</li></ul>
<h3>XSLT Parameters</h3>
<p>Your editor should have a way to recognize which parameters are mandatory and easily set these parameters before running a transformation.</p>
<h3>Initial Template</h3>
<p>XSLT 3.0 allows running a stylesheet without an input document using <span style="color:green">xsl:initial-template</span>.<br></p>
<p>So your editor should support this XSLT:</p>
<p>&lt;xsl:template name="xsl:initial-template"&gt;</p><p> &lt;xsl:value-of select="'HELLO WORLD!'"/&gt;</p><p>&lt;/xsl:template&gt;</p>
<h2>Current XSLT Editors Compared</h2>
<p>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. </p>
<p>If you're interested in how the four XSLT 3.0 editors (OxygenXML, XMLSpy, XMLBlueprint, VSCode) perform against the presented criteria, please see <a href="https://www.xmlblueprint.com/best-xslt-editors.htm">the results of my comparison</a>.</p>
<p>Please let me know if you have additional features that would make your XSLT editing faster, easier or more correct.</p>
</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><div class="list-of-titles"><div class="lot toc"><div class="title">Table of Contents</div><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#intro">1.&nbsp;Introduction</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#playalong">1.1.&nbsp;Play along at home!</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#howtoread">1.2.&nbsp;Input or output?</a></li></ul></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#input">2.&nbsp;The input</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#rules">2.1.&nbsp;Rules</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#rhs">2.2.&nbsp;Organizing the “right hand side”</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#literals">2.3.&nbsp;Matching literal characters</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#strings">2.3.1.&nbsp;Matching strings</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#encoded">2.3.2.&nbsp;Matching individual characters</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#sets">2.3.3.&nbsp;Character sets</a></li></ul></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#seq">2.4.&nbsp;Matching sequences</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#names-ws">2.5.&nbsp;Matching names and whitespace</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#names">2.5.1.&nbsp;Matching names</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#whitespace">2.5.2.&nbsp;Matching whitespace</a></li></ul></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#ambiguity">2.6.&nbsp;Ambiguity</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#epsilon">2.6.1.&nbsp;Matching nothing</a></li></ul></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#nonxml">2.7.&nbsp;Non-XML characters</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#insertions">2.8.&nbsp;Insertions</a></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#renaming">2.9.&nbsp;Renaming</a></li></ul></li><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#output">3.&nbsp;The output</a><ul class="toc"><li><a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#cant">3.1.&nbsp;What you can’t do</a></li></ul></li></ul></div></div><div class="db-bfs"><p>This article is a follow-up to the introduction to
<a href="https://www.xml.com/articles/2022/03/01/invisible-xml/" class="link">Invisible XML</a> published
at <a href="https://www.xml.com/" class="link">XML.com</a> on 1&nbsp;March&nbsp;2022 (and
<a href="https://www.xml.com/articles/2025/12/02/invisible-xml-update/">slightly revised</a> in November, 2025).</p><p>This article was revised in November, 2025 to include the following corrections
and additions:</p><ul class="itemizedlist"><li>The syntax for repetition changed after the original publication.
Where previously “*” and “+” were the repetition separators, those are now “**” and “++”.
</li><li>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.
</li><li>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.
</li><li>Finally, there are minor changes to examples and outputs as many tools have evolved.
</li></ul><p>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.</p></div>
<section id="intro"><header><h2>1.&nbsp;&nbsp;Introduction</h2></header><p>If you’re familiar with writing grammars in any
<a href="https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form" class="link">BNF</a>
(or <a href="https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form" class="link">EBNF</a>) 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!</p><p>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 <b class="firstterm">grammar</b> 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 <b class="firstterm">symbol</b> 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.</p><p>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.</p>
<p>Invisible XML is defined by an Invisible XML grammar. It is an
instance of itself. The
<a href="https://invisiblexml.org/ixml-specification.html#complete" class="link">complete
grammar</a> is only about 45 rules. Printed, it would fit on one side
of a sheet of standard office paper.</p><p>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.</p>
<section id="playalong"><header><h3>1.1.&nbsp;&nbsp;Play along at home!</h3></header><p>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.</p><p>For an even more interactive introduction to Invisible XML, check out
<span class="first-last personname">John Lumley</span>’s
<a href="https://johnlumley.github.io/jwiXML.xhtml" class="link">jωiXML workbench</a>.
Alternatively, you can download <a href="https://coffeepot.nineml.org/" class="link">CoffeePot</a>, a command line
Invisible XML processor that’s part of the <a href="https://nineml.org/" class="link">NineML</a> 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
<a href="https://invisiblexml.org/" class="link">Invisible XML homepage</a>.</p></section>
<section id="howtoread"><header><h3>1.2.&nbsp;&nbsp;Input or output?</h3></header><p>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.</p><p>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.</p><p>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 <em>all</em>
the lifting.</p></section></section>
<header id="input"><h2>2.&nbsp;&nbsp;The input</h2></header><p>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”).</p><p>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).
</p><p>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.</p><p>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.</p>
<header id="rules"><h3>2.1.&nbsp;&nbsp;Rules</h3></header><p>A rule has the form of a name (the left hand side) followed by a
colon, followed by <a href="https://www.xml.com/articles/2025/12/16/invisible-xml-grammars-update/#epsilon" class="link">zero</a> 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:</p>
<div class="codehighlight"><pre><span></span>symbol-name <span class="o">=</span> defining, symbols, here .
</pre></div>
<p>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
“<code>thing</code>” is a “<code>this</code>”, followed by a
“<code>that</code>”:</p>
<div class="codehighlight"><pre><span></span><span class="nv">thing</span> <span class="o">=</span> this, that .
</pre></div>
<p>This rule says that a “<code>thing</code>” is a “<code>this</code>” <em>or</em>
a “<code>that</code>”:</p>
<div class="codehighlight"><pre><span></span><span class="nv">thing</span> <span class="o">=</span> this <span class="p">|</span> that .
</pre></div>
<p>Whitespace around the punctuation is insignificant,
“<code>this;that</code>” is the same as “<code>this; that</code>” is
the same as “<code>this ; that</code>”. That’s true of all the rule
punctuation except that there must be at least one whitspace character between
consecutive rules.</p><div class="admonition note"><div><div class="icon">ⓘ</div><div class="body"><header><div class="title"><b>Note</b></div></header><div><p>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.</p></div></div></div></div><p>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.</p>
<header id="rhs"><h3>2.2.&nbsp;Organizing the “right hand side”</h3></header><p>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.</p><p>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 <em>alternatives</em>
separated from each other by “;” (or “|”). Each alternative
is composed of a series of <em>terms</em> separated by “,”. A
term is composed of <em>factors</em>. 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.
</p><p>For example, in the following rule:</p>
<div class="codehighlight"><pre><span></span><span class="nv">memo</span> <span class="o">=</span> recipient, <span class=& |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Involved Issue / 该 PR 相关 Issue
Close #
Example for the Proposed Route(s) / 路由地址示例
New RSS Route Checklist / 新 RSS 路由检查表
PuppeteerNote / 说明
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 entrylist instead of scraping a listing page. The feed is served as
application/atom+xml, whichofetch would otherwise hand back as a
Blob, hence the explicitresponseType: 'text'. Onlythe first page of the feed is requested.
What the route adds on top of the feed:
<summary>and carries no
<content>. The route fetches each detail page and takes the body fromarticle.article > div.body. Measured on the 20 entries currently in the feed, the body is554 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.the detail page from
#tags a; 17 of the 20 entries have at least one tag.pubDatecomes from the Atom<published>element (ISO 8601, with offset), parsed withparseDate. It is the publish date of the item; the feed carries no separate event time.authorcomes from the Atom<author>element.