Xml XSLT:如果标签存在,则应用模板;如果不是,请选择静态值

Xml XSLT:如果标签存在,则应用模板;如果不是,请选择静态值,xml,xslt,xslt-2.0,xslt-1.0,Xml,Xslt,Xslt 2.0,Xslt 1.0,我对XSLT一般来说是新手,所以请耐心听我说 考虑到这一点,我试图做的是检查XML中的某个标记。如果有,我想应用一个模板。如果不是,我想添加它(作为空白值)。基本上总是强迫它进入最终输出。我该怎么做 我有过这样的经历 <xsl:choose> <xsl:when test="@href"> <xsl:apply-templates select="country" /> </xsl:when> <xsl

我对XSLT一般来说是新手,所以请耐心听我说

考虑到这一点,我试图做的是检查XML中的某个标记。如果有,我想应用一个模板。如果不是,我想添加它(作为空白值)。基本上总是强迫它进入最终输出。我该怎么做

我有过这样的经历

<xsl:choose>
    <xsl:when test="@href">
        <xsl:apply-templates select="country" />
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
</xsl:choose>
有人能帮忙吗?先谢谢你

编辑:


是的,最后我需要在XML中至少有一个
标记。但它可能根本不存在。如果它不存在,我必须把它放进去。一个好的输入示例是,在父元素的模板中,
US

预计将使用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/other
xsl:if
应该足够了,因为应用模板不会处理不存在的子元素。

您甚至不需要任何类型的。此样式表:

<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>

布罗丁纳格
小人

更简单一些

<xsl:template match="foo[not(country)]">
        <country>US</country>
    <xsl:apply-templates/>
</xsl:template>

美国
注意事项

<xsl:template match="foo[not(country)]">
        <country>US</country>
    <xsl:apply-templates/>
</xsl:template>
未使用XSLT条件指令(例如
,它们不是必需的


通常情况下,
的存在表明,除其他外,通过去除条件指令,可以重构代码并显著改进代码。

考虑发布两个输入样本(一个存在数据,另一个缺失数据),然后向我们显示您要为这两个对象创建的输出。然后,我们可以使用适当的XSLT提供帮助。恐怕您目前描述的“检查某个标签”不太准确,很难判断
是否符合您的要求。这将检查上下文节点是否具有
href
属性,而检查“标记”听起来像是要检查特定元素节点。在你的
中,否则
你可能只想放一个
foo
结果el''是错误的,我相信这是个好问题,+1。请参阅我的答案,以获得比当前接受的解决方案更短、更简单的解决方案。我的解决方案中绝对没有XSLT条件指令!我做了一些非常相似的事情……所以我想你得到了正确的答案。时间对这一次很重要,所以我一直坚持到它是正确的。但不管怎样,如果我想知道它是否存在或是空的话,那又如何呢?@搜索知识,请考虑一个新的、独立的问题,包括XML输入和所需结果的必要细节。但是如果你需要提供另一个默认元素,你会怎么做?例如,@JRQ,在这种特殊情况下,没有提供特定的源XML文档,因此只能猜测所需的架构。说:`美国华盛顿'或者,它可能是(可能性是无限的):`华盛顿'我可以看到。但是,一个更通用的解决方案比一个在测试数量大于1时不再有效的解决方案要好。@JRQ同意。这就是为什么任何人都可以用他们感兴趣的更具体的场景问一个新问题。