1

XMLで処理/生成された要素の処理を可能にする「exsl:node-set」の概念とその使用法を理解しようとしています。誰か助けてくれませんか

次のアクティビティを順番に実行できる XSL コードの開発から始めました。

  1. 2 つの要素の平均を取る
  2. レコード全体の平均値を正規化します。

例: 以下のサンプル入力ファイルの各レコード

  1. 平均 = (c + d)/2
    • 平均 = (c+d)/2 = (12+12)/2 = 12, (8+12)/2=10 ....
  2. avg_nom = 平均/分(平均)
    • avg_nom = 平均/分(平均) = 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 がツリー内に 2 つのレベルしかないという以前の質問への回答として提供されました。<top><Results>

これは完全に正常に機能しますが、上記の XML 入力では、 のデータが失われます<Level1>。私はコードを理解していないので、必要な修正を行います。

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

必要なのは、正しい出力を得るために上記のコードを修正するだけでなく、コードをさらに理解することです。このために、上記の例に追加のステップを追加したいと思います

  1. Final=(b_nom+avg_nom)/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>
4

1 に答える 1