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>

我只想要 if 工作......

//编辑

一个解释:

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

所以我希望'if'检查'requirements'的所有(在这种情况下)元素是否被'offer'的元素满足

4

5 回答 5

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()
于 2011-01-10T23:12:28.483 回答
1

使用这个 XPath 2.0 表达式

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

其中

$requirements/*/requirements/*

$offer/*/offer/*

并且这些是针对下面的 XML 文档进行评估的(本质上是提供的非格式良好的 XML 制作的格式良好的 XML 文档):

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

对于您的初始问题,使用相同的技术:

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

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

于 2011-01-11T05:21:22.633 回答
0

也许你正在寻找

test="$self/one/xxx 中的每个 $x 满足 $self/two/yyy 中的一些 $y 满足 $x = $y"

于 2011-01-10T22:58:10.167 回答
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>
于 2011-01-10T21:21:51.503 回答
0

编辑

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!
于 2011-01-10T21:58:54.493 回答