XSLT应用模板条件

时间:2017-03-29 08:02:30

标签: xslt xslt-2.0 xslt-grouping

我在应用模板时遇到问题,请考虑我的xml会是这样的, 在这里输入代码

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

在主要内部,所有step1将以1开始,并在进一步的步骤中递增。现在,当面板到来时,它应该将每个面板作为一个步骤,它将以3.,4开始.4。下一步将是是5。

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

目前我有类似的东西,

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

如何修改以按顺序应用模板,同时将面板编号为3.

1 个答案:

答案 0 :(得分:0)

这是一个猜测,因为我不完全清楚你想做什么,但我认为你能做的就是这个...

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

|符号是union运算符,节点的并集将按文档顺序选择。因此,它会选择第一个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>