“理解”;exsl:节点集";用于对输入xml执行多个操作
我试图理解“exsl:node set”的概念及其使用,它支持在XML中处理/生成的元素。有人能帮忙吗 我从开发XSL代码开始,该代码可以按顺序执行以下活动:“理解”;exsl:节点集";用于对输入xml执行多个操作,xml,xslt,Xml,Xslt,我试图理解“exsl:node set”的概念及其使用,它支持在XML中处理/生成的元素。有人能帮忙吗 我从开发XSL代码开始,该代码可以按顺序执行以下活动: 取两个元素的平均值 规范化记录之间的平均值 例如: 在下面的每个记录的示例输入文件中 平均值=(c+d)/2 平均值=(c+d)/2=(12+12)/2=12,(8+12)/2=10 平均值=平均值/分钟(平均值) 平均值=平均/分钟(平均)=12/分钟(12,10,15,27)=1.2 输入XML <?xml versio
- 平均值=(c+d)/2=(12+12)/2=12,(8+12)/2=10
- 平均值=平均/分钟(平均)=12/分钟(12,10,15,27)=1.2
<?xml version="1.0" encoding="UTF-8"?>
<top>
<Level1>
<Results>
<a>no</a>
<b>10</b>
<b_nom>1.66</b_nom>
<c>12</c>
<d>9</d>
</Results>
</Level1>
<Level1>
<Results>
<a>no</a>
<b>8</b>
<b_nom>1.33</b_nom>
<c>50</c>
<d>12</d>
</Results>
<Level1>
</Level1>
<Results>
<a>no</a>
<b>6</b>
<b_nom>1</b_nom>
<c>55</c>
<d>56</d>
</Results>
<Level1>
</Level1>
<Results>
<a>yes</a>
<b>23</b>
<b_nom>1</b_nom>
<c>32</c>
<d>34</d>
</Results>
</Level1>
</top>
其中示例XML在树中只有两个级别,即
对于这一点,这非常好,但是对于上面的XML输入,我丢失了
的数据。我不理解代码并进行了必要的更正
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="step1-result-fragment">
<xsl:apply-templates select="top" mode="step1"/>
</xsl:variable>
<xsl:variable name="step1-result" select="exsl:node-set($step1-result-fragment)"/>
<xsl:template match="@* | node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@* | node()" mode="step1" name="step1-identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="step1"/>
</xsl:copy>
</xsl:template>
<xsl:template match="c" mode="step1">
<avg><xsl:value-of select="(. + ../d) div 2"/></avg>
<xsl:call-template name="step1-identity"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:variable name="min-avg">
<xsl:for-each select="$step1-result/top//Results/avg">
<xsl:sort select="." data-type="number"/>
<xsl:if test="position() = 1">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:apply-templates select="$step1-result/top//Results">
<xsl:with-param name="min-avg" select="$min-avg"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="Results">
<xsl:param name="min-avg"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:with-param name="min-avg" select="$min-avg"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="avg">
<xsl:param name="min-avg"/>
<xsl:call-template name="identity"/>
<avg_nom><xsl:value-of select=". div $min-avg"/></avg_nom>
</xsl:template>
</xsl:stylesheet>
我需要的不仅是对上述代码的更正,以获得正确的输出,还需要进一步理解代码。为此,我想在上述示例中添加一个附加步骤
最终=(b_名义+平均名义)/2
因此,最终输出应该如下所示
<?xml version="1.0"?>
<top>
<Level1>
<Results>
<a>no</a>
<b>10</b>
<b_nom>1.66</b_nom>
<avg>10.5</avg>
<avg_nom>1</avg_nom>
<final>5.5</final>
<c>12</c>
<d>9</d>
</Results>
</Level1>
<Level1>
<Results>
<a>no</a>
<b>8</b>
<b_nom>1.33</b_nom>
<avg>31</avg>
<avg_nom>2.95238095238095</avg_nom>
<final>2.14</final>
<c>50</c>
<d>12</d>
</Results>
</Level1>
<Level1>
<Results>
<a>no</a>
<b>6</b>
<b_nom>1</b_nom>
<avg>55.5</avg>
<avg_nom>5.28571428571429</avg_nom>
<final>3.14</final>
<c>55</c>
<d>56</d>
</Results>
</Level1>
<Level1>
<Results>
<a>yes</a>
<b>23</b>
<b_nom>1</b_nom>
<avg>33</avg>
<avg_nom>3.14285714285714</avg_nom>
<final>2.07</final>
<c>32</c>
<d>34</d>
</Results>
</Level1>
</top>
不
10
1.66
10.5
1.
5.5
12
9
不
8.
1.33
31
2.95238095238095
2.14
50
12
不
6.
1.
55.5
5.28571428571429
3.14
55
56
对
23
1.
33
3.14285714285714
2.07
32
34
在XSLT 2.0中,可以创建一个值为树的变量:
<xsl:variable name="temp">
<root>
<xsl:call-template name="do-something"/>
</root>
</xsl:variable>
从概念上讲,exslt:node-set()将结果树片段(xsl:apply-templates不允许处理该片段)转换为单例节点集(它是单例节点集)。可能在大多数实现中,这是一个非常好的禁止操作
我希望这能帮助您理解样式表的作用。在XSLT 2.0中,您可以创建一个值为树的变量:
<xsl:variable name="temp">
<root>
<xsl:call-template name="do-something"/>
</root>
</xsl:variable>
从概念上讲,exslt:node-set()将结果树片段(xsl:apply-templates不允许处理该片段)转换为单例节点集(它是单例节点集)。可能在大多数实现中,这是一个非常好的禁止操作
我希望这能帮助您理解样式表在做什么
<xsl:apply-templates select="exslt:node-set($temp)" mode="postprocess"/>