Xml 如何在模板中添加新模板?
我已经输入了关于结构的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
<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>