1

下午好。

我对 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 属性值,则其他元素上相同值的任何重复都应该在标准输出上触发一条消息。为了达到这个目的,我在 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 文件中打印错误,而不是仅在 IDREF 上存在具有相同值的元素时才这样做。我对语言的理解和我的搜索都无法帮助我理解这个问题以及如何解决它。关于为什么会发生这种情况的任何想法?

亲切的问候

4

2 回答 2

2
attribute::ref= ./@ref

与 @ref=@ref 相同,因此无论 ref 的值如何,都是如此,

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

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

这会测试是否有 2 个(或更多与当前青睐元素具有相同 ref 的 contra 元素,也许您想要 [1] 或使用 ../* 而不是 ../contra,这一切都取决于。问题尚不清楚足以确定。

于 2013-11-17T20:38:06.540 回答
0

1)尝试&lt;而不是>

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

3)为什么要计算前后兄弟姐妹,那不能像

<xsl:if test="count(../contra[@ref = ./@ref]) &lt; 0">
于 2013-11-17T20:36:33.637 回答