XSLT: если тег существует, примените шаблон; если нет, выберите статическое значение
Я новичок в XSLT в целом, поэтому, пожалуйста, медведь со мной...
имея это в виду, то, что я пытаюсь сделать, это проверить определенный тег в XML. Если он есть, я хочу применить шаблон. Если нет, я хочу добавить его (как пустое значение). В основном, всегда заставляя его быть в конечном выходе. Как мне это сделать?
у меня было что-то вроде этого...
<xsl:choose>
<xsl:when test="@href">
<xsl:apply-templates select="country" />
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
верхняя poriton кодекса является то, что я думаю, что я ошибаюсь. Нужно что-то в otherwise
тег и мой when
- это неправильно, я думаю.
<xsl:template match="country">
<xsl:if test=". != '' or count(./@*) != 0">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
может кто-нибудь помочь? Заранее спасибо.
EDIT:
да в конце концов мне нужно, по крайней мере <country />
тег должен быть в XML. Но возможно, что его не существует!--19-->на всех. Если его нет, я должен его вставить. Примером хорошего ввода будет <country>US</country>
3 ответов
в шаблоне для родительского элемента ожидается, что элемент country будет использоваться, например
<xsl:template match="foo">
<xsl:if test="not(country)">
<country>US</country>
</xsl:if>
<xsl:apply-templates/>
</xsl:template>
вместо foo
используйте имя родительского элемента. И, конечно, вы также можете сделать другие вещи, такие как копирование элемента, я сосредоточился на if
проверка. Вам действительно не нужно xsl:choose/when/otherwise
на мой взгляд,xsl:if
должно быть достаточно, поскольку apply-templates ничего не будет делать с дочерними элементами, которые не существуют.
еще проще:
<xsl:template match="foo[not(country)]">
<country>US</country>
<xsl:apply-templates/>
</xsl:template>
обратите внимание:
нет условных инструкций XSLT (например,<xsl:if>
) используются и они не нужны.
очень часто, наличие <xsl:if>
или <xsl:choose>
- это означает, что код может быть переработан и значительно улучшен, в частности, избавление от условного.
вам даже не нужен какой-либо Условной Обработки. Этим стилем:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item[not(country)]">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<country>Lilliput</country>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
С этого входа:
<root>
<item>
<country>Brobdingnag</country>
</item>
<item>
<test/>
</item>
</root>
выход:
<root>
<item>
<country>Brobdingnag</country>
</item>
<item>
<test></test>
<country>Lilliput</country>
</item>
</root>