Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在模板中添加新模板?_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

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

Xml 如何在模板中添加新模板?,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我已经输入了关于结构的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="Decim

我已经输入了关于结构的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>

A1
a1
1.2
A1
a2
0.5
A2
b1
1.3
A3
c1
1.8
A3
c2
0.2
A3
c3
1.1
我想要输出:

<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>

3.
A1
a1
1.2
a2
0.5
A2
b1
1.3
A3
c1
1.8
c2
0.2
c3
1.1
我当前的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>

3.
A1
a1
1.2
a2
0.5
A2
b1
1.3
A3
c1
1.8
c2
0.2
c3
1.1
我试图循环一个额外的模板来添加
节点,并使用
应用模板
功能和一个新的键和分组,但失败了

如何解决这个问题?或者我需要从头重写脚本,并以不同的方式处理它?

尝试以下操作:
  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>