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) попробуй <
вместо >
2) в for-each
вы проходите favor
элементы, в if
ты считаешь contra
элементы, надеюсь, это то, что вы действительно хотите
3) почему считать предшествующих и последующих братьев и сестер, не может ли это быть во всех сразу
<xsl:if test="count(../contra[@ref = ./@ref]) < 0">