С XSLT, как я могу использовать выбор / когда для удаления элементов из документа
Вот мой пример документа
<a >
<b flag='foo'>
<c/>
<d/>
</b>
</a>
Я пытаюсь удалить элемент "c" только тогда, когда атрибут флага на b - это "bar". Т.е. если flag='foo', элемент "c" не должен быть удален. В настоящее время на моем компьютере нет средства отладки xsl, и я не смог найти онлайн-инструмент, отображающий информацию об ошибках xslt, и выполнял следующее тестовое преобразование xsl на http://xslttest.appspot.com/:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" version="1.0" encoding="ISO-8859-1"/>
<!--Identity template to copy all content by default-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:choose>
<xsl:when test="/a/b[@flag='bar']">
<xsl:template match="/a/b/c"/>
</xsl:when>
</xsl:choose>
</xsl:stylesheet>
Когда я запускаю это, я получаю сообщение об ошибке: не удалось скомпилировать таблицу стилей. Обнаружено 3 ошибки. Я ищу помощь (1) для исправления проблем с кодом xsl и (2) всего, что угодно, например jsfiddle для xsl, которое может отлаживать / тестировать ошибки кода xsl.
1 ответ
Вы не можете положить choose
вне template
, но вам не нужно - вы можете использовать предикаты в выражениях совпадений, поэтому просто объявите ваш неоперативный шаблон для соответствия элементам, которые вы хотите удалить:
<xsl:template match="b[@flag='bar']/c" />
или, в более общем случае, если родитель c
элемент может иметь разные имена
<xsl:template match="c[../@flag='bar']" />
или же
<xsl:template match="*[@flag='bar']/c" />