XSLT 应用模板调节

XSLT apply templates conditioning

我在应用模板时遇到问题,考虑到我的 xml 会像这样, 在此处输入代码

<card>
   <pre/>
<main>    
  <step1/>
  <step1/>
  <panels>
    <panel/>
    <panel/>
  </panels>
  <step1/>
<main> 
 </card>

在 main 中,所有的 step1 都将以 1. 开始,并在面板出现时进一步递增 step.Now,它应该将每个面板作为一个步骤,它将以 3. , 4. next 开始step1 将是 5.

问题是,如果我在 mainfunc 中为 step1 应用模板,它会应用所有 step1。所以panel之后的step1也会排在第一位。我想为第 1 步到第 3 步应用模板。然后应用面板,然后应用最后的 step1。step1 计数并不总是相同,它们不同。

目前我有这样的东西,

<xsl:template match="mainfunc">
    <xsl:apply-templates select="step1"/>
    <xsl:if test="contains($wcType,'P')">
    <xsl:apply-templates select="panels"/>
    </xsl:if>
.....

如何修改以按顺序应用模板,并将面板编号为 3。

这有点猜测,因为我不完全清楚你想做什么,但我认为你可以做的是这个...

<xsl:apply-templates select="step1|panels[contains($wcType,'P')]"/>

|符号是并集运算符,节点的并集将select按文档顺序排列。所以,它将 select 第一个 step1,然后是 panels,然后是下一个 step1

例如,这个 XSLT...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:variable name="wcType" select="'Pie'" />

    <xsl:template match="main">
        <xsl:apply-templates select="step1|panels[contains($wcType,'P')]"/>
    </xsl:template>

    <xsl:template match="step1|panel">
        <xsl:copy>
            <xsl:number count="step1|panel" level="any" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

应用于此 XML...

<card>
  <main>    
    <step1/>
    <step1/>
    <panels>
      <panel/>
      <panel/>
    </panels>
    <step1/>
  </main> 
</card>

下面是输出

<step1>1</step1>
<step1>2</step1>
  <panel>3</panel>
  <panel>4</panel>
<step1>5</step1>