Xml 如果属性或元素不存在,是否有方法使XSLT抛出错误?

Xml 如果属性或元素不存在,是否有方法使XSLT抛出错误?,xml,xslt,Xml,Xslt,当我试图访问源XML中不存在的属性(或元素)时,我正在寻找一种使XSLT抛出错误的简单方法。 目前我要做的是首先检查属性是否存在,如果不存在则手动抛出错误-例如: 错误消息 我发现有很多代码需要检查一个属性——特别是如果你对所有属性都这样做的话。 在XSLT中是否有其他方法可以做到这一点?例如,通过设置“对不存在的属性中止”之类的指令 我知道一种方法是使用DTD或Schema,如果没有直接的XSLT方法,我会这样做 非常感谢 XSLT1.0基于匹配节点的模板,因此可以编写一个模板来匹配没有

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


错误消息
我发现有很多代码需要检查一个属性——特别是如果你对所有属性都这样做的话。 在XSLT中是否有其他方法可以做到这一点?例如,通过设置“对不存在的属性中止”之类的指令

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


非常感谢

XSLT1.0基于匹配节点的模板,因此可以编写一个模板来匹配没有特定属性的所有元素

<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>
例如,以下模板将匹配所有元素,例如没有@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>

因此,如果您想强制某些元素具有特定属性,您可以在匹配表达式中使用类似于:Element[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>

当某些元素具有某些属性(如“having a attribute”、“属性值无效”、“子元素数为5”等)时,您可以编写所需的复杂模板(应该不是很复杂)来抛出错误


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

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

<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>
例如,以下模板将匹配所有元素,例如没有@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>

因此,如果您想强制某些元素具有特定属性,您可以在匹配表达式中使用类似于:Element[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>

当某些元素具有某些属性(如“having a attribute”、“属性值无效”、“子元素数为5”等)时,您可以编写所需的复杂模板(应该不是很复杂)来抛出错误


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

在XPath 2.0中,每当您想使用节点$N,如果节点不存在则失败时,只需在函数调用中将对$N的引用精确地包装为一个($N)或一个或多个($N)。

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