我试图动态设置属性,但我根本无法做到。你可以帮帮我吗?理想的例子:)
输入:
<root>
<row>
<col>v11</col>
<col>v12</col>
<col>v13</col>
<col>v14</col>
</row>
<row>
<col>v21</col>
<col>v22</col>
<col>v23</col>
<col>v24</col>
</row>
</root>
当前的XSLT计划:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates select="row"/>
</root>
</xsl:template>
<xsl:template match="col">
<data col="1" row="1">
<xsl:value-of select="."/>
</data>
</xsl:template>
<xsl:template match="row">
<xsl:apply-templates select="col"/>
</xsl:template>
</xsl:stylesheet>
当前输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data col="1" row="1">v11</data>
<data col="1" row="1">v12</data>
<data col="1" row="1">v13</data>
<data col="1" row="1">v14</data>
<data col="1" row="1">v21</data>
<data col="1" row="1">v22</data>
<data col="1" row="1">v23</data>
<data col="1" row="1">v24</data>
</root>
如何动态分配属性值?
我需要这样做:
<root>
<data row="1" col="1">v11</data>
<data row="1" col="2">v12</data>
<data row="1" col="3">v13</data>
<data row="1" col="4">v14</data>
<data row="2" col="1">v21</data>
<data row="2" col="2">v22</data>
<data row="2" col="3">v23</data>
<data row="2" col="4">v24</data>
</root>
谢谢!
答案 0 :(得分:2)
除了使用position()
之外,另一种方法是使用xsl:number
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates select="row"/>
</root>
</xsl:template>
<xsl:template match="col">
<data>
<xsl:attribute name="row">
<xsl:number count="row" />
</xsl:attribute>
<xsl:attribute name="col">
<xsl:number count="col" />
</xsl:attribute>
<xsl:value-of select="."/>
</data>
</xsl:template>
<xsl:template match="row">
<xsl:apply-templates select="col"/>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行此操作时,结果为:
<root>
<data row="1" col="1">v11</data>
<data row="1" col="2">v12</data>
<data row="1" col="3">v13</data>
<data row="1" col="4">v14</data>
<data row="2" col="1">v21</data>
<data row="2" col="2">v22</data>
<data row="2" col="3">v23</data>
<data row="2" col="4">v24</data>
</root>
答案 1 :(得分:0)
如果您修改apply-templates
元素的col
以传递row
的位置...
<xsl:apply-templates select="col">
<xsl:with-param name="row" select="position()" />
</xsl:apply-templates>
然后,在匹配row
的模板中,您可以使用此参数以及col
元素的位置
<data col="{position()}" row="{$row}">
<xsl:value-of select="."/>
</data>
请注意这里使用花括号来创建属性。这些被称为Attribute Value Templates
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="root">
<root>
<xsl:apply-templates select="row"/>
</root>
</xsl:template>
<xsl:template match="col">
<xsl:param name="row" />
<data col="{position()}" row="{$row}">
<xsl:value-of select="."/>
</data>
</xsl:template>
<xsl:template match="row">
<xsl:apply-templates select="col">
<xsl:with-param name="row" select="position()" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
这是第三种方式:
<xsl:template match="col">
<data col="{count(preceding-sibling::col)+1}"
row="{count(../preceding-sibling::row)+1}">
<xsl:value-of select="."/>
</data>
</xsl:template>
所有这些解决方案的共同之处在于,它们将输出计算为输入的函数,而不保持程序变量中的可变状态。这是函数式编程的本质。