2011-01-10 60 views
1

不知道怎么解释清楚,所以我就举一个例子: xml文件:如果有多个元素

<root> 
    <one> 
    <a a="x"/> 
    <a a="y"/> 
    </one> 
    <two> 
    <a a="x"/> 
    <a a="y"/> 
    </two> 
</root> 

,这里是一个xsl:

<xsl:template match="/root"> 
     <xsl:variable name="self" select="."/> 

     <xsl:if test="one/a/@a = $self/two/*/a/@a"> 
      <xsl:text>it works</xsl:text> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

我只是希望,如果工作...

//编辑

的解释:

<requirements> 
    <bar/><restaurant/> 
</requirements> 
<offer> 
    <bar/></beach><restaurant/><nightclub/> 
<offer> 

,所以我想“如果”,以检查是否所有(在这种情况下)元素的需求'被“报价”

+0

你想要`if`条件来测试吗? – 2011-01-10 21:20:24

+0

if语句是否应该表示“找到任何一个”one“,其中的@a与”aa“中的任意一个匹配@a参数?目前还不清楚你的陈述应该是什么意思。 – Jacob 2011-01-10 21:22:23

+0

@Greg,我想他是试图检查`one`中是否有'two`中的项目匹配 – CaffGeek 2011-01-10 21:22:35

回答

0

也许这的元素是否满意?

<xsl:template match="/root"> 
    <xsl:variable name="self" select="."/> 
    <xsl:variable name="aKey" select="one/a/@a"/> 

    <xsl:if test="$self/two/*/a[@a=$aKey]"> 
     <xsl:text>it works</xsl:text> 
    </xsl:if> 
</xsl:template> 
0

EDIT

XSLT 1.0解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="validTest"> 
    <xsl:for-each select="/*/requirements/*"> 
     <xsl:value-of select="concat(name(),'+')"/> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:template match="offer"> 
    <xsl:if test="count(/*/requirements/*) = count(*[ 
            contains($validTest, 
             concat(name(),'+') 
             ) 
            ])"> 
     <xsl:value-of select="concat('#', @id, ' is a valid offer!&#xa;')"/> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

施加到XML示例:

<root> 
    <requirements> 
    <bar/><restaurant/> 
    </requirements> 
    <offer id="1"> 
    <bar/><beach/><restaurant/><nightclub/> 
    </offer> 
    <offer id="2"> 
    <bar/><beach/><nightclub/> 
    </offer> 
    <offer id="2"> 
    <beach/><nightclub/><restaurant/> 
    </offer> 
    <offer id="4"> 
    <bar/><beach/><restaurant/><nightclub/> 
    </offer> 
</root> 

产生这样的结果:

#1 is a valid offer! 
#4 is a valid offer! 
0

也许你正在寻找

测试= “$中的每一个自我$ X /一个/ XXX 满足在$自/二/ YYY 满足$ X = $ Y约$ Y”

1

该XSLT样式表1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kElementByName" match="requirements/*" use="name()"/> 
    <xsl:template match="offer[count(*[key('kElementByName',name())]) 
           = count(../requirements/*)]"> 
     <xsl:text>Success!</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

利用这种输入(以及形成的):

<root> 
    <requirements> 
     <bar/> 
     <restaurant/> 
    </requirements> 
    <offer> 
     <bar/> 
     <beach/> 
     <restaurant/> 
     <nightclub/> 
    </offer> 
</root> 

输出:

Success! 

注意:使用xsl:key因为功能隐含节点集铸造,只标采取的第一个节点。

的XPath 2.0表达式:

every $name in /root/requirements/*/name() 
satisfies $name = /root/offer/*/name() 
1

使用这个XPath 2。0表达

not($requirements[not(name()=$offer/name())]) 

其中

$requirements/*/requirements/*

$offer/*/offer/*

并且这些对下面 XML文档进行评估(基本上提供非简洁(wellformed)XML作出简洁(wellformed)的XML文档):

<t> 
    <requirements> 
     <bar/> 
     <restaurant/> 
    </requirements> 
    <offer> 
     <baz/> 
     <beach/> 
     <restaurant/> 
     <nightclub/> 
    </offer> 
</t> 

为初始问题相同的技术:

not(/*/one/a[not(@a = /*/two/a/@a)]) 

请注意,以上是单向XPath 1.0解决方案:)