XSLT: проверьте, имеют ли одинаковые атрибуты 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>

Который всегда печатает Error в html-файле, вместо того, чтобы делать это, только когда есть элементы с одинаковыми значениями в IDREF. И мое понимание языка, и мои поиски не смогли помочь мне понять эту проблему и способы ее решения. Есть идеи, почему это может произойти?

С уважением

2 ответа

Решение
attribute::ref= ./@ref

совпадает с @ref=@ref, так что истинно, независимо от значения ref,

Я не уверен в релевантности фрагмента XSD (в котором не упоминается ссылка), но, возможно, вы хотите

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

Это проверяет, есть ли 2 (или больше элементов контраргумента с той же ссылкой, что и текущий элемент фаворита, возможно, вы хотите [1] или использовать../* вместо../contra, все зависит. Вопрос неясен достаточно, чтобы быть уверенным.

1) попробуй &lt; вместо >

2) в for-each вы проходите favor элементы, в if ты считаешь contra элементы, надеюсь, это то, что вы действительно хотите

3) почему считать предшествующих и последующих братьев и сестер, не может ли это быть во всех сразу

<xsl:if test="count(../contra[@ref = ./@ref]) &lt; 0">
Другие вопросы по тегам