如何在模板中添加新模板?

How to adding a new template inside the template?

我输入了关于结构的xml文件:

<TabularXml>
 <Sheet>
  <Row srcidx="2">
   <Cell srcidx="1" name="A" type="String">A1</Cell>
   <Cell srcidx="2" name="B" type="String">a1</Cell>
   <Cell srcidx="3" name="C" type="Decimal">1.2</Cell>
  </Row>
  <Row srcidx="3">
   <Cell srcidx="1" name="A" type="String">A1</Cell>
   <Cell srcidx="2" name="B" type="String">a2</Cell>
   <Cell srcidx="3" name="C" type="Decimal">0.5</Cell>
  </Row>
  <Row srcidx="4">
   <Cell srcidx="1" name="A" type="String">A2</Cell>
   <Cell srcidx="2" name="B" type="String">b1</Cell>
   <Cell srcidx="3" name="C" type="Decimal">1.3</Cell>
  </Row>
  <Row srcidx="5">
   <Cell srcidx="1" name="A" type="String">A3</Cell>
   <Cell srcidx="2" name="B" type="String">c1</Cell>
   <Cell srcidx="3" name="C" type="Decimal">1.8</Cell>
  </Row>
  <Row srcidx="6">
   <Cell srcidx="1" name="A" type="String">A3</Cell>
   <Cell srcidx="2" name="B" type="String">c2</Cell>
   <Cell srcidx="3" name="C" type="Decimal">0.2</Cell>
  </Row>
  <Row srcidx="7">
   <Cell srcidx="1" name="A" type="String">A3</Cell>
   <Cell srcidx="2" name="B" type="String">c3</Cell>
   <Cell srcidx="3" name="C" type="Decimal">1.1</Cell>
  </Row>
 </Sheet>
</TabularXml>

我想要输出:

<Beholdninger xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AntalPoster>3</AntalPoster>
 <AllePoster>
  <EnPost>
   <A>A1</A>
   <Papirer>
    <Papir>
     <B>a1</B>
     <C>1.2</C>
    </Papir>
    <Papir>
     <B>a2</B>
     <C>0.5</C>
    </Papir>
   </Papirer>
  </EnPost>
  <EnPost>
   <A>A2</A>
   <Papirer>
    <Papir>
     <B>b1</B>
     <C>1.3</C>
    </Papir>
   </Papirer>
   </EnPost>
   <EnPost>
    <A>A3</A>
    <Papirer>
     <Papir>
      <B>c1</B>
      <C>1.8</C>
     </Papir>
     <Papir>
      <B>c2</B>
      <C>0.2</C>
     </Papir>
     <Papir>
      <B>c3</B>
      <C>1.1</C>
     </Papir>
    </Papirer>
   </EnPost>
 </AllePoster>
</Beholdninger>

我当前的 xslt 代码:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="a-group" match="Row" use="Cell[@name = 'A']"/>

  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Sheet">
     <Beholdninger>
         <xsl:variable name="group-heads" select="Row[generate-id() = generate-id(key('a-group', Cell[@name = 'A'])[1])]"/>
         <AntalPoster><xsl:value-of select="count($group-heads)"/></AntalPoster>
         <AllePoster>
            <xsl:apply-templates select="$group-heads"/>
         </AllePoster>
     </Beholdninger> 
  </xsl:template>

  <xsl:template match="Row">
    <EnPost>
        <A><xsl:value-of select="Cell[@name = 'A']"/></A>       
        <Papirer>
            <xsl:apply-templates select="key('a-group', Cell[@name = 'A'])/Cell[@name = 'B'] | key('a-group', Cell[@name = 'A'])/Cell[@name = 'C']"/>
        </Papirer>  
    </EnPost>       
  </xsl:template>

  <xsl:template match="Cell[@name = 'B']" name="B">
        <B><xsl:value-of select="."/></B>                           
  </xsl:template>

  <xsl:template match="Cell[@name = 'C']" name="C">
        <C><xsl:value-of select="."/></C>                   
</xsl:stylesheet>

我在哪里:

<Beholdninger xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AntalPoster>3</AntalPoster>
 <AllePoster>
  <EnPost>
   <A>A1</A>
   <Papirer>
    <B>a1</B>
    <C>1.2</C>
    <B>a2</B>
    <C>0.5</C>
   </Papirer>
  </EnPost>
  <EnPost>
   <A>A2</A>
   <Papirer>
    <B>b1</B>
    <C>1.3</C>
   </Papirer>
   </EnPost>
   <EnPost>
    <A>A3</A>
    <Papirer>
     <B>c1</B>
     <C>1.8</C>
     <B>c2</B>
     <C>0.2</C>
     <B>c3</B>
     <C>1.1</C>
    </Papirer>
   </EnPost>
 </AllePoster>
</Beholdninger>

我试图循环一个额外的模板来添加一个 <Papir></Papir> 节点并使用 apply-templates 函数和一个新的键和分组,但我失败了。

如何解决?或者我可能需要从头重写脚本并以不同的方式处理它?

  Try this:

  <xsl:key name="a-group" match="Row" use="Cell[@name = 'A']"/>

  <xsl:template match="/">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Sheet">
    <Beholdninger>
      <AntalPoster>
        <xsl:value-of select="count(Row[generate-id() = generate-id(key('a-group', Cell[@name = 'A'])[1])])"/>
      </AntalPoster>
      <AllePoster>
        <xsl:for-each select="Row[generate-id() = generate-id(key('a-group', Cell[@name = 'A'])[1])]">
          <EnPost>
            <A>
              <xsl:value-of select="Cell[@name = 'A']"/>
            </A>
            <Papirer>
              <xsl:for-each select="key('a-group', Cell[@name = 'A'])">
                <Papir>
                  <xsl:apply-templates select="."/>
                </Papir>
              </xsl:for-each>
            </Papirer>
          </EnPost>
        </xsl:for-each>
      </AllePoster>
    </Beholdninger>
  </xsl:template>

  <xsl:template match="Row">
    <xsl:apply-templates select="Cell[@name = 'B']"/>
    <xsl:apply-templates select="Cell[@name = 'C']"/>
  </xsl:template>

  <xsl:template match="Cell[@name = 'B']" name="B">
    <B>
      <xsl:value-of select="."/>
    </B>
  </xsl:template>

  <xsl:template match="Cell[@name = 'C']" name="C">
    <C>
      <xsl:value-of select="."/>
    </C>
  </xsl:template>