Создание родительско-дочерних элементов из семантической иерархии в значениях элементов в XSLT 2
У меня есть ряд тегов P в содержимом XML, которые имеют семантическую иерархию в своих начальных значениях, однако теги P являются линейными. Ищем XSLT 2 преобразование.
Семантическая иерархия выглядит следующим образом:
(1)
+-(a)
+-(I)
+-(A)
С последовательностью RegEx следующим образом:
<xsl:param name="patternOrder" as="element(pattern)*" xmlns="">
<pattern level="1" value="^(\([0-9]+(\.[0-9]+)?\))" />
<pattern level="2" value="^(\([a-z]\))" />
<pattern level="3" value="^(\((IX|IV|V?I{{0,3}})\))" />
<pattern level="4" value="^(\([\w]+(\.[\w]+)?\))" />
</xsl>
После просмотра моего набора данных у меня есть различные условия:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>
<p>(1) blah</p>
<p>(2)(a) blah</p>
<p>(b) blah</p>
<p>(3)(a)(I) blah</p>
<p>(II) blah</p>
<p>(A) blah</p>
<p>(B.1) blah</p>
<p>(b) blah</p>
<p>(4) blah</p>
<p>(4.5) blah</p>
<p>(5)(a)(I)(A) blah</p>
<p>(B) blah</p>
<p>(II) blah</p>
<p>(III)(a) blah</p>
<p>(bb.2) blah</p>
<p>(6) blah</p>
</content>
<content>
<p>blah</p>
</content>
<content>
<p>blah</p>
<p>(1) blah</p>
<p>(a) blah</p>
<p>(b) blah</p>
<p>(2) blah </p>
</content>
</test>
... и конечные результаты должны быть:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>
<p>(1) blah</p>
<p>(2)
<p>(a) blah</p>
<p>(b) blah</p>
</p>
<p>(3)
<p>(a)
<p>(I) blah</p>
<p>(II) blah
<p>(A) blah</p>
<p>(B) blah</p>
</p>
</p>
<p>(b) blah</p>
</p>
<p>(4) blah</p>
<p>(4.5) blah</p>
<p>(5)
<p>(a)
<p>(I)
<p>(A) blah</p>
<p>(B.1) blah</p>
</p>
<p>(II) blah</p>
<p>(III)</p>
<p>(a) blah</p>
<p>(bb.2) blah</p>
</p>
</p>
<p>(6) blah</p>
</content>
<content>
blah
</content>
<content>
blah
<p>(1) blah
<p>(a) blah</p>
<p>(b) blah</p>
</p>
<p>(2) blah </p>
</content>
</test>
Обратите внимание на условие, если семантическая иерархия отсутствует в теге P - тогда тег P удаляется и является значением его родительского элемента содержимого.
РЕДАКТИРОВАТЬ:Я был в состоянии обнаружить все семантические условия, используя следующий RegEx:
^(\(([\w]+(\.[\w]+)?)\)){1,4}
*РЕДАКТИРОВАТЬ № 2 *С атрибутами выравнивания:
<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>
<p level="1">(1) blah</p>
<p level="1">(2)</p>
<p level="2">(a) blah</p>
<p level="2">(b) blah</p>
<p level="1">(3)</p>
<p level="2">(a)</p>
<p level="3">(I) blah</p>
<p level="3">(II) blah</p>
<p level="4">(A) blah</p>
<p level="4">(B.1) blah</p>
<p level="2">(b) blah</p>
<p level="1">(4) blah</p>
<p level="1">(4.5) blah</p>
<p level="1">(5)</p>
<p level="2">(a)</p>
<p level="3">(I)</p>
<p level="4">(A) blah</p>
<p level="4">(B) blah</p>
<p level="3">(II) blah</p>
<p level="3">(III)</p>
<p level="2">(a) blah</p>
<p level="2">(bb.2) blah</p>
<p level="2">(6) blah</p>
</content>
<content>
<p>blah</p>
</content>
<content>
<p>blah</p>
<p level="1">(1) blah</p>
<p level="2">(a) blah</p>
<p level="2">(b) blah</p>
<p level="1">(2) blah </p>
</content>
</test>