XSLT:验证sibbling节点是否具有相同的IDREF属性

时间:2013-11-17 20:06:18

标签: xml xslt xpath xsd idref

下午好。

我是XML,XSD和XSLT的新手,我面临以下问题: 我在XSD中有以下子结构,它可以多次出现,这是一个更大的结构的一部分,这是无关紧要的,我不会为了清晰起见而包括:

<xs:complexType name= "listavotosmocao">
<xs:choice maxOccurs="unbounded">
    <xs:element name="favor" type="pessoaref"/>
    <xs:element name="contra" type="pessoaref"/>
    <xs:element name="abstiveram" type="pessoaref"/>
</xs:choice>
</xs:complexType> 

<xs:complexType name="pessoaref">
<xs:attribute ref="id" type="xs:string"/>
</xs:complexType>

使用XLST我想知道如果一个元素具有某个IDREF属性值,那么其他元素上任何相同值的重复都应该在stdout上触发一条消息。 为实现这一目标,我在XSLT中写了以下几行:

<xsl:for-each select="votacao//favor">
   <xsl:if test="(count(preceding-sibling::contra[attribute::ref= ./@ref])
   + count(following-sibling::contra[attribute::ref=./@ref]) )> 0">
        Error
   </xsl:if>
</xsl:for-each>

总是在html文件中打印Error,而不是仅在IDREF上存在具有相同值的元素时才这样做。 我对语言的理解和我的搜索都无法帮助我理解这个问题以及如何解决它。 为什么会出现这种情况的任何想法?

亲切的问候

2 个答案:

答案 0 :(得分:2)

attribute::ref= ./@ref

与@ ref = @ ref相同所以无论ref的值是什么,

我不确定XSD片段的相关性(没有提及参考),但也许你想要

<xsl:if test="../contra[@ref=current()/@ref][2]">
    Error
</xsl:if>

测试是否有2个(或更多的反向元素与当前的fav元素具有相同的ref,也许你想要[1]或者使用../*而不是../contra,这一切都取决于。问题不清楚是不是很确定。

答案 1 :(得分:0)

1)尝试&lt;而不是>

2)在for-each中,您正在循环favor元素,在if中您正在计算contra元素,希望这是您真正想要的

3)为什么要计算兄弟姐妹之前和之后的情况,不能像

一样
<xsl:if test="count(../contra[@ref = ./@ref]) &lt; 0">