如果属性或元素不存在,有没有办法让XSLT抛出错误?

时间:2013-02-28 10:30:54

标签: xml xslt

当我尝试访问源XML中不存在的属性(或元素)时,我正在寻找一种简单的方法来使XSLT抛出错误。 目前我所做的是首先检查属性是否存在,如果不存在则手动抛出错误 - 例如:     

<xsl:if test="not(attribute_to_use)">

 <xsl:message terminate="yes">

  <xsl:text>error message</xsl:text>                    

 </xsl:message>

</xsl:if>

<!-- do something -->

<xsl:attribute name="new_attribute"><xsl:value-of select="attribute_to_use" /></xsl:attribute>

我发现要检查属性的代码很多 - 特别是如果你为所有属性执行此操作。 有没有其他方法可以在XSLT中执行此操作 - 例如通过设置“非现有属性中止”这样的指令?

我知道一种方法是使用DTD或模式,如果没有直接的XSLT方式,我会这样做。

非常感谢!

2 个答案:

答案 0 :(得分:2)

如您所知,

XSLT 1.0基于匹配节点的模板,因此您可以编写模板以匹配所有没有特定属性的元素。

例如,以下模板将匹配所有元素,例如没有@id属性。

<xsl:template match="*[not(@id)]">
    <xsl:message terminate="yes">
        <xsl:value-of select="concat('Attribute @id does not exist in element ', name())" />
    </xsl:message>
</xsl:template>

因此,如果你想强加某些元素具有特定的属性,你可以在匹配表达式中使用类似于:元素[not(@id)] | Element2 [not(@a)]等等然后写一个不同的每个元素的模板,以便在具有这些属性的情况下处理它们:

<xsl:template match="Element[not(@id)]|Element2[not(@a)]">
     <!-- Throw error message -->
</xsl:template>

<xsl:template match="Element">
     <!-- Process Elements which have an @id attribute -->
</xsl:template>

<xsl:template match="Element2">
     <!-- Process Elements which have an @a attribute -->
</xsl:template>

当某些元素具有某些属性(例如具有属性&#39;,&#39;的值)时,您可以根据需要编写复杂的模板(这不应该非常复杂)。属性无效&#39;,&#39;孩子的数量是5&#39;等

希望能让您了解如何以一般方式实现您想要实现的目标。

答案 1 :(得分:2)

在XPath 2.0中,每当你想使用一个节点$ N并且如果它不存在就失败,只需在函数调用中将引用包装为$ N($ N)或一个或多个( $ N)。