2017-01-19 4 views
0

for-eachループの外側にある要素にアクセスしようとして問題が発生しています。ここに私のXMLがあります。で、私は "//Tool/sta.time" の値を表示しようとしていますaccess external要素for a eachの内部

 <div> 
    <h1> 
    <table width="100%" border="1"> 
    <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td>7</td> 
      <td>Tool</td> 
      <td>Holder</td> 
      <td>0.59</td> 
     </tr> 
     <tr> 
      <td>5</td> 
      <td>Second</td> 
      <td>secholder</td> 
      <td>1.93</td> 
     </tr> 
    </tbody> 
    </table> 
    </h1> 
    </div> 

:ここ

<JobList sta.time="151.879"> 
<Job T.number="7" T.identifier="Tool" T.holder.comment="Holder" sta.time="30.789" /> 
<Job T.number="5" T.identifier="Second" T.holder.comment="secholder" sta.time="35.567" /> 
<Job T.number="7" T.identifier="Tool" T.holder.comment="Holder" sta.time="4.778" /> 
<Job T.number="5" T.identifier="Second" T.holder.comment="secholder" sta.time="80.745" /> 
<Tool sta.time="116.312" number="5" /> 
<Tool sta.time="35.567" number="7" /> 
</JobList> 

は私のXSLのエキス

<table width="100%" border="1"> 
     <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:variable name="vsortOrder" select="//Job[@T.number]" /> 
     <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 
      <tr> 
      <td> 
       <xsl:value-of select="@T.number" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.identifier" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.holder.comment" /> 
      </td> 
      </xsl:for-each> 
      <xsl:for-each select="//Tool[$vsortOrder/Job/@T.number]"> 
      <td> 
       <xsl:value-of select="format-number(@sta.time div 60,'#0.00')" /> 
      </td> 
      </tr> 
     </xsl:for-each> 
     </tbody> 
    </table> 

所望の出力であります@ T.numberと同じオーダー。どのように私はこれを行う/任意のアイデアは、これを構造化?

+0

恐らく、 '/'の過度の使用、 '' xsl:for-each'の多すぎる組み合わせ、 ''先行する兄弟:: 'の代わりに' '::' 'を使うこと。 XSLTの変更を提案できるように、希望する出力を追加できますか? –

+0

希望の結果に追加しました。 –

+0

あなたの結果は意味をなさない: 'T.number = 7'にリンクされた' sta.time'値は35.567で、60で除算すると0.59を生成します。しかし、T.number = 5の行には0.59が表示されます.0.84の値はどこから来たのですか? –

答えて

0

--- ---

number電流JobT.numberに一致Toolを選択するための好ましい方法は、としてkeyを定義することである。

<xsl:key name="tool" match="Tool" use="@number" /> 

として使用します。

<xsl:value-of select="format-number(key('tool', @T.number)/@sta.time div 60,'0.00')"/> 

このことにも注意:

<xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 

は、重複を排除するための良い方法ではありません。以下のスタイルシートに示すように、あなたは、代わりにMuenchian methodを使用する必要があります。これは、あなたの入力例に適用されると

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/> 

<xsl:key name="job" match="Job" use="@T.number" /> 
<xsl:key name="tool" match="Tool" use="@number" /> 

<xsl:template match="/JobList"> 
    <table width="100%" border="1"> 
     <thead> 
      <tr> 
       <td>Numbers</td> 
       <td>Description</td> 
       <td>Holder</td> 
       <td>Time</td> 
      </tr> 
     </thead> 
     <tbody> 
      <xsl:for-each select="Job[count(. | key('job', @T.number)[1]) = 1]"> 
       <tr> 
        <td> 
         <xsl:value-of select="@T.number" /> 
        </td> 
        <td> 
         <xsl:value-of select="@T.identifier" /> 
        </td> 
        <td> 
         <xsl:value-of select="@T.holder.comment" /> 
        </td> 
        <td> 
         <xsl:value-of select="format-number(key('tool', @T.number)/@sta.time div 60,'0.00')"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </tbody> 
    </table> 
</xsl:template> 

</xsl:stylesheet> 

、結果は以下のようになります。

<table width="100%" border="1"> 
    <thead> 
     <tr> 
     <td>Numbers</td> 
     <td>Description</td> 
     <td>Holder</td> 
     <td>Time</td> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td>7</td> 
     <td>Tool</td> 
     <td>Holder</td> 
     <td>0.59</td> 
     </tr> 
     <tr> 
     <td>5</td> 
     <td>Second</td> 
     <td>secholder</td> 
     <td>1.94</td> 
     </tr> 
    </tbody> 
</table> 

これはあなたの質問に示された結果とは異なりますが、それでも正しい結果であると思われます。

+0

私はあなたの2番目のXSLコードを試してみましたが、それは動作しますが、1つの問題を見つけました。私は自分の質問で「ツール」要素がT.numberによって数値順になっていることを忘れていました。だから私はあなたのコードを実行すると、正しい順序でsta.timeを印刷しないと、いくつかの領域にNaNがあります。私は質問のコードを更新しました。 –

+0

@AlexW 'Job'と' Tool'が 'T.number'と' number'の共通の値でリンクされていると仮定するのは正しいでしょうか?そしてもしそうなら、これらのユニークなものはどれですか?あなたの事例を更新し、起こりうる重複を示してください。 –

+0

はい "T.number"は "number"と同じですが、 "T.number"は注文にソートされています。私は、正しい "sta.time"値で重複してXMLを更新しました。本当に感謝してくれてありがとうございます。 –

0

JobToolにマッピングするために、ジョブ要素とツール要素の位置を利用できます。ジョブの最初の発生がソースXMLでのツール要素の最初の発生に対応しているので、このような何か:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:template match="/"> 
     <table width="100%" border="1"> 
     <thead> 
     <tr> 
      <td>Numbers</td> 
      <td>Description</td> 
      <td>Holder</td> 
      <td>Time</td> 
     </tr> 
     </thead> 
     <tbody> 
     <xsl:variable name="vsortOrder" select="//Tool" /> 
     <xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]"> 
      <tr> 
      <td> 
       <xsl:value-of select="@T.number" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.identifier" /> 
      </td> 
      <td> 
       <xsl:value-of select="@T.holder.comment" /> 
      </td> 
      <td> 
      <xsl:variable name="job-position" select="position()"/> 
      <xsl:value-of select="format-number($vsortOrder[position()=$job-position]/@sta.time div 60,'0.00')"/> 
      </td> 
      </tr> 
      </xsl:for-each> 
     </tbody> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 

はテスト<xsl:for-each select="//Job[not(@T.number=preceding::Job/@T.number)]">フォームを、あなたが同じ2つの(?またはそれ以上)の求人要素を有していても良いようですあなたはそれらを1つとして扱いたいと思っています。そのためには、muenchianグルーピングを使用して一意のT.numberを持つジョブを保存し、その位置をvsortOrderにあるTool要素の位置と一致させることをお勧めします。明確化の観点で編集

+1

** 1。** exsl:node-set()を使用して、その名前空間に 'exsl'プレフィックスを最初にバインドすることはできません。 - ** 2。**ここでは 'exsl:node-set()'を使う必要はありません。変数はすでにノード集合である。そして、変数の本当の必要性もありません。 –

+0

ありがとう@ michael.hor257k。私はノードセット拡張機能を削除しました。変数を私のオリジナルのソリューションの一部として使用しています。 – Madeyedexter

+0

私の質問では、 "ツール"要素はT.numberによって数値順に記載されていることを忘れていました。新しい値で質問を更新しました。あなたのコードを試してみると、sta.timeは正しい順序ではありませんでした。私の質問でそれを帰せないのは申し訳ありません。私はそれを見落とした。 –

関連する問題