英文:
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"/>
<xsl:apply-templates select="set"/>
</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:
<xsl:template match="page">
<xsl:apply-templates select="set/item[1]"/>
<xsl:apply-templates select="set"/>
</xsl:template>
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:
<xsl:template match="page">
<xsl:apply-templates select="set/item[1]" 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>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论