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>