Я пытаюсь создать XSL, который преобразует XML, используя следующие шаги:
- Определите, имеет ли элемент под корневыми «свойствами» имя, начинающееся с «foo». Если он не начинается с «foo», удалите элемент.
- Создайте новые элементы с именем «entry» с атрибутом «key», равным имени элементов, начинающихся с «foo».
Процесс также может выполняться в порядке, обратном указанным шагам, если это кажется проще.
XML-документ
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<oof>AAA</oof>
<bar>BBB</bar>
<foobar>CCC</foobar>
<barfoo>DDD</barfoo>
<foofoofoobar>EEE</foofoofoobar>
</properties>
Мой XSLT, который только изменяет элемент на запись
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="properties/*">
<entry>
<xsl:attribute name="key" select="name()"/>
<xsl:apply-templates select="@* | node()"/>
</entry>
</xsl:template>
Когда я пытаюсь использовать другой шаблон <xsl:template match="properties[not(contains(name(), 'foo'))]"/>
, он не выполняется после шаблона элемента "entry". Если я делаю шаблон перед шаблоном записи, шаблон записи не выполняется.
Желаемый результат
<?xml version="1.0" encoding="UTF-8"?>
<properties>
<entry key="foobar">CCC</entry>
<entry key="foofoofoobar">EEE</entry>
</properties>
Ваша помощь очень ценится.
ИЗМЕНИТЬ
Мне удалось создать <xsl:template match="entry[not(contains(@*, 'foo'))]"/>
, который удалит элементы ввода, не содержащие foo, что не совсем то, что я хочу, но это еще один шаг в правильном направлении. Однако, если я помещу все это в один XSLT-документ, будет работать только первый шаблон.