2010-11-09 1 views
1

Вот пример того, что я пытаюсь сделать. XML:XSL: Как ограничить выбор в шаблонах заявок на основе отдельного элемента XML

<TEST> 
    <NODE> 
    <A id="ELEMENT_1"/> 
    <A id="ELEMENT_2"/> 
    <A id="ELEMENT_3"/> 
    </NODE> 
    <SOME_OTHER_NODE> 
    <B nodeId="ELEMENT_1" invalid="1"/> 
    </SOME_OTHER_NODE> 
</TEST> 

XSL:

<xsl:apply-templates select="A[?? only select the A's where there is no B where A/@id = B/@nodeId and B/@invalid = 1 ??]"/> 

даже возможно ли это? В реальной XSL У меня есть что-то вроде этого в настоящее время:

<xsl:apply-templates select="(ANSWER|GROUP)[position() mod 2 = 0]"/> 

И я хочу, чтобы найти способ ограничить ANSWER-х выбран на основе другого элемента в XML. Надеюсь, я ясно объяснил это, дайте мне знать, если нет. Возможно, есть лучший способ сделать что-то подобное. Я открыт для любых отзывов или предложений. Благодарю.

ответ

2

Это выражение XPath (узел набора сравнения) с NODE в качестве контекста:

A[not(@id = ../../SOME_OTHER_NODE/B[@invalid='1']/@nodeId)] 

С ключами:

<xsl:key name="kInvalidTest" match="B[@invalid=1]" use="@nodeId"/> 
... 
<xsl:appy-templates select="A[not(key('kInvalidTest',@id))]"/> 
+0

работает как шарм. Спасибо! – testing123

+0

@ testing123: Добро пожаловать! –

+0

После добавления еще нескольких элементов в SOME_OTHER_NODE он больше не работает, потому что isHidden соответствует нескольким элементам. Мысли? – testing123