2

当我尝试访问源 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 方式,我会这样做。

非常感谢!

4

2 回答 2

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>

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

您可以根据需要编写复杂的模板(这不应该很复杂),以在某些元素具有某些属性(例如“具有属性”、“属性的值无效”、“子项数为 5)时引发错误', ETC。

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

于 2013-02-28T10:56:49.020 回答
2

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

于 2013-02-28T14:45:56.143 回答