我需要在第一个div上匹配类名行-1,即在另一个div中,也是类名行-1。这很容易。但问题是,有时第一个带有类名行的div -1是唯一具有该类名称的div。当这种情况发生的时候,我需要和它匹配。
xml可以如下所示:场景1
<div class="row-1">
<div class="someClassName">
<div class="row-1">content</div> (match this one)
<div class="row-1">content</div>
<div class="row-1">content</div>
</div>
</div>
或者像这样:场景2
<div class="row-1"> (match this one)
<div class="someClassName">
<div class="somOtherClassName">content</div>
</div>
</div>
这个标记在文档中有几个层次(这意味着围绕它的还有其他div)。
这是第一个场景中要匹配的xsl:
<xsl:template match="//div[contains(concat(' ', @class, ' '), ' row-1 ')]//div[contains(concat(' ', @class, ' '), ' row-1 ')][position() = 1]"> 但是,当我需要检查两种情况时,xsl会是怎样的呢?一次只能发生一种情况。我试着使用xsl:template,但它不允许在这些模板中具有template:match。
如有任何建议,敬请见谅。
编辑:
这似乎适用于场景2:
<xsl:template match="//div[contains(concat(' ', @class, ' '), ' row-1 ')][not(descendant::div[contains(concat(' ', @class, ' '), ' row-1 ')])][not(ancestor::div[contains(concat(' ', @class, ' '), ' row-1 ')])]">然而,这似乎有点冗长。如果有人有更好的方法做这件事,请告诉我。
发布于 2016-10-11 14:22:57
如果我正确理解了任务,您需要在文档中将第一个div与不包含其他div的类"row-1“匹配,并在任何嵌套级别上使用"row-1”类。您可以使用带有子代轴的XPath "is“操作符来选择文档中必需元素的第一次出现:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:t="stackoverflow.com"
version="2.0">
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="attribute()">
<xsl:copy/>
</xsl:template>
<xsl:template match="div[. is (//div)[t:is-row1-div(.)][empty(descendant::div[t:is-row1-div(.)])][1]]">
<xsl:copy>
<xsl:apply-templates select="attribute()"/>
<xsl:text>(Matched) </xsl:text>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:function name="t:is-row1-div" as="xs:boolean">
<xsl:param name="div" as="element(div)"/>
<xsl:sequence select="boolean($div/@class eq 'row-1')"/>
</xsl:function>
</xsl:transform>您可以在这里测试此转换:http://xsltransform.net/ejivdH3
https://stackoverflow.com/questions/39405097
复制相似问题