Для приведенного ниже (надуманного) примера HTML:
<div>
<p>lorem <a href="lorem.html" target="_blank">ipsum</a></p>
<a href="foo.html" target="top">foo</a>
<p><img src="foo.jpg" class="bar"/></p>
<img src="bar.jpg" class="bar"/>
</div>
Я пытаюсь написать преобразование XSLT 1.0, которое:
- белый список верхнего уровня
<p>
*Атрибут 1008 * - белых списков
href
для <a>
- атрибут белых списков
src
атрибут для <img>
- оберток верхнего уровня
<a>
и <img>
в <p>...</p>
В идеале это можно сделать способом, позволяющим добавлять больше элементов и атрибутов.
Ожидаемый результат:
<div>
<p>lorem <a href="lorem.html">ipsum</a></p>
<p><a href="foo.html">foo</a></p>
<p><img src="foo.jpg"/></p>
<p><img src="bar.jpg"/></p>
</div>
Следующий XSLT 2.0 работает благодаря<xsl:next-match>
:
Fiddle: https://xsltfiddle.liberty -development.net / 6r5Gh3p :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/div">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- whitelist <p> as top-level element -->
<xsl:template match="/div/p">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- coerce top-level <img> and <a> as children <p> -->
<xsl:template match="/div/img|/div/a">
<p><xsl:next-match/></p>
</xsl:template>
<!-- whitelist href attribute for <a> -->
<xsl:template match="a">
<xsl:copy>
<xsl:copy-of select="@href"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- whitelist src attribute for <img> -->
<xsl:template match="img">
<xsl:copy>
<xsl:copy-of select="@src"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
В XSLT 1.0 отсутствует <next-match>
и использование шаблонаниже соответствует только один раз, поэтому <a>
и <img>
заключаются в <p>
, но их атрибуты не попадают в белый список:
Fiddle: https://xsltfiddle.liberty -development.net / 94rmq6r
<xsl:template match="/div/img|/div/a">
<p>
<xsl:copy><xsl:apply-templates/></xsl:copy>
</p>
</xsl:template>
Вывод:
<div>
<p>lorem <a href="lorem.html">ipsum</a></p>
<p><a>foo</a></p>
<p><img src="foo.jpg"/></p>
<p><img/></p>
</div>
Как это можно сделать в XSLT 1.0?