Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.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
“理解”;exsl:节点集";用于对输入xml执行多个操作_Xml_Xslt - Fatal编程技术网

“理解”;exsl:节点集";用于对输入xml执行多个操作

“理解”;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

我试图理解“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 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"/>