在列表中匹配第一个项目,同时也包括在完整列表中。

huangapple go评论65阅读模式
英文:

match first item in a list but also include in full list

问题

It seems like you're looking for a translation of the provided code snippet and explanation. Here's the translated code snippet:

我试图匹配列表中的第一个项目,同时也包括完整列表中的第一个项目,而不调用第一个项目模板

给定一个 XML 文件:

    <page>
         <set>         
            <item><name>One</name></item>
            <item><name>Two</name></item>
         </set>
    </page>

和 XSLT   

    <xsl:template match="page">
        <xsl:apply-templates select="set/item[1]"/>

        <xsl:apply-templates select="set"/>
    </xsl:template>


    <xsl:template match="set">
         <xsl:apply-templates select="item"/>
    </xsl:template>

    <!-- 仅匹配第一个项目 -->
    <xsl:template match="set/item[1]">
    FIZZ   
    </xsl:template>

    <!-- 匹配所有项目,包括第一个项目 -->
    <xsl:template match="item">
    BUZZ
    </xsl:template>

我的目标是获得 FIZZ BUZZ BUZZ。但我得到了 FIZZ FIZZ BUZZ,这表明 `set/item[1]` 是从 `<xsl:apply-templates select="item"/>` 被调用的

如果需要,我可以放弃 `set`,所以 XML 将是

    <item><name>One</name></item>
    <item><name>One</name></item>

这与以下问题类似但不同:
https://stackoverflow.com/questions/5067791/xslt-matching-first-x-items-of-filtered-result-set

I hope this helps! If you have any more questions or need further assistance, feel free to ask.

英文:

I'm seeking to match the first item in a list but also include the first item in a full list without calling the first item template

given an xml file:

<page>
     <set>         
        <item><name>One</name></item>
        <item><name>Two</name></item>
     </set>
</page>

and xslt

<xsl:template match="page">
    <xsl:apply-templates select="set/item[1]"/>

    <xsl:apply-templates select="set"/>
</xsl:template>


<xsl:template match="set">
     <xsl:apply-templates select="item"/>
</xsl:template>

<!-- match only the first item -->
<xsl:template match="set/item[1]">
FIZZ   
</xsl:template>

<!-- match all the items including the first one -->
<xsl:template match="item">
BUZZ
</xsl:template>

My goal is to get FIZZ BUZZ BUZZ. But I get FIZZ FIZZ BUZZ. suggesting that the set/item[1] is called from the <xsl:apply-templates select="item"/>

im ok with dropping the set if needed so the xml would be

<item><name>One</name></item>
<item><name>One</name></item>

It's similar but different to the following question:
https://stackoverflow.com/questions/5067791/xslt-matching-first-x-items-of-filtered-result-set

答案1

得分: 1

<xsl:template match="page">
<xsl:apply-templates select="set/item1"/>

&lt;xsl:apply-templates select=&quot;set&quot;/&gt;

</xsl:template>

将模板应用于第一个项目两次:一次直接应用,一次作为set的一部分。

每当您将模板应用于一组节点时,处理器都会搜索与所选集合中的每个节点最匹配的模板并将其应用。因此,与set/item[1]匹配的模板将在每次处理它时选择为第一个item


如果您只想对第一个item进行不同的处理一次,然后将其与其余的集合一起用于进一步处理,您将需要使用其他方法 - 例如,不同的模式

<xsl:template match="page">
<xsl:apply-templates select="set/item1" mode="first"/>
<xsl:apply-templates select="set"/>
</xsl:template>

<xsl:template match="item" mode="first">
FIZZ
</xsl:template>

<xsl:template match="item">
BUZZ
</xsl:template>

英文:

Your initial template:

&lt;xsl:template match=&quot;page&quot;&gt;
    &lt;xsl:apply-templates select=&quot;set/item[1]&quot;/&gt;

    &lt;xsl:apply-templates select=&quot;set&quot;/&gt;
&lt;/xsl:template&gt;

applies templates to the first item twice: once directly, and once as part of set.

Every time you apply templates to a set of nodes, the processor searches for the template that best matches each node in the selected set and applies it. So a template matching set/item[1] will be chosen for the first item every time it is processed.


If you want different processing for the first item only once, and then include it with the rest of the set for further processing, you will need to use some other method - e.g. a different mode:

&lt;xsl:template match=&quot;page&quot;&gt;
    &lt;xsl:apply-templates select=&quot;set/item[1]&quot; mode=&quot;first&quot;/&gt;
    &lt;xsl:apply-templates select=&quot;set&quot;/&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match=&quot;item&quot; mode=&quot;first&quot;&gt;
FIZZ   
&lt;/xsl:template&gt;

&lt;xsl:template match=&quot;item&quot;&gt;
BUZZ
&lt;/xsl:template&gt;

huangapple
  • 本文由 发表于 2023年1月6日 10:29:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/75026359.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定