首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XSLT:如何根据级别匹配元素的第一次或第二次出现

XSLT:如何根据级别匹配元素的第一次或第二次出现
EN

Stack Overflow用户
提问于 2016-09-09 06:25:35
回答 1查看 569关注 0票数 0

我需要在第一个div上匹配类名行-1,即在另一个div中,也是类名行-1。这很容易。但问题是,有时第一个带有类名行的div -1是唯一具有该类名称的div。当这种情况发生的时候,我需要和它匹配。

xml可以如下所示:场景1

代码语言:javascript
复制
<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

代码语言:javascript
复制
<div class="row-1"> (match this one)
    <div class="someClassName">
        <div class="somOtherClassName">content</div>
    </div>
</div>

这个标记在文档中有几个层次(这意味着围绕它的还有其他div)。

这是第一个场景中要匹配的xsl:

代码语言:javascript
复制
<xsl:template match="//div[contains(concat(' ', @class, ' '), ' row-1 ')]//div[contains(concat(' ', @class, ' '), ' row-1 ')][position() = 1]">  

但是,当我需要检查两种情况时,xsl会是怎样的呢?一次只能发生一种情况。我试着使用xsl:template,但它不允许在这些模板中具有template:match。

如有任何建议,敬请见谅。

编辑:

这似乎适用于场景2:

代码语言:javascript
复制
<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 ')])]">

然而,这似乎有点冗长。如果有人有更好的方法做这件事,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 14:22:57

如果我正确理解了任务,您需要在文档中将第一个div与不包含其他div的类"row-1“匹配,并在任何嵌套级别上使用"row-1”类。您可以使用带有子代轴的XPath "is“操作符来选择文档中必需元素的第一次出现:

代码语言:javascript
复制
<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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39405097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档