2016-06-29 1 views
0

У меня есть образец XMLКак сравнить узлы с помощью xslt-кода?

<ConditionTable> 
    <incondition name = "abc" /> 
    <incondition name = "xyz" /> 
    <outconditon name = "abc" /> 
    <outcondition name = "xyz" /> 
    <job name = "hello world" /> 
</ConditionTable> 

<ConditionTable> 
    <incondition name = "abc" /> 
    <incondition name = "xyz" /> 
    <outcondition name = "xyz" /> 
    <outcondition name = "xyz" /> 
    <job name = "hello world2" /> 
</ConditionTable> 

Я пытаюсь написать XSLT таким образом, что Если ALL имя incondition имеет по крайней мере одно имя соответствия outcondition, то имя задания печатается. До сих пор у меня есть что-то вроде этого:

<xsl:for-each select="ConditionTable/incondition "> 
    <xsl:if test="(current()/@name = ../outcondition/@name)" 
     <xsl:value-of select="../job/@name" /> 
    </xsl:if> 
</xsl:for-each> 

Но он печатает как имена рабочих мест. Я не должен печатать имя задания, если хотя бы одно условие не выполняется.

+0

outconditon = outcondition –

+0

http://stackoverflow.com/help/someone-answers –

ответ

0

Сделайте тест отрицательный - к примеру:

<xsl:for-each select="ConditionTable"> 
    <xsl:variable name="t" select="." /> 
    <xsl:if test="not(incondition[not(key('out', @name, $t))])"> 
     <xsl:value-of select="job/@name" /> 
    </xsl:if> 
</xsl:for-each> 

, где будет определен ключ, как:

<xsl:key name="out" match="outcondition" use="@name"/> 
0

Если ALL имя incondition имеет по крайней мере одно сопрягая имя outcondition

Самый прямой способ выразить это выражение XPath 2.0

test="every $i in incondition satisfies 
     some $o in outcondition satisfies 
      $i eq $o" 

Вы можете сократить это, воспользовавшись тем, что A=$b означает some $a in A satisfies $a eq $b, что дает вам

test="every $i in incondition satisfies 
     $i = outcondition 

Если вы хотите, чтобы сделать его еще более кратким, вы можете воспользоваться тем, что every X satisfies Y превращается в not(some X satisfies not(Y)), который дает

test="not(some $i in incondition satisfies not($i = outcondition))" 

, который дополнительно упрощается:

test="not(incondition[not(.=outcondition)])" 

но это может быть немного кратким для некоторых вкусов.

0

Предполагая, что проверка «условия» на «условие отсутствия» должна выполняться только в пределах одного и того же ConditionTable.

Попробуйте XSLT 1.0:

<xsl:for-each select="ConditionTable"> 
     <xsl:if test ="not(incondition[ not(../outcondition/@name = @name) ])" > 
      <xsl:value-of select="../job/@name" /> 
     </xsl:if> 
    </xsl:for-each>