2017-10-20 15 views
0

XSLTを使用してHTMLを作成するXMLファイルの書式設定に問題があります。私は一般的に、XML要素に含まれる各属性の値を順番に取得したいと考えています。 これはXSLTにハードコードされています。私のXMLファイルが変更されると、XSLTはその仕事をしません。 私は<xsl:value-of select="@(name(@*[1]))" />のようなものを使って要素の最初の属性値を取得しようとしましたが、機能しません。XMLファイルから属性値を順番に取得するXSLT

どうすればよいですか?

ありがとうございます。 @TimCは私にはない答えとして、 OK:

<testsuites disabled="0" errors="0" failures="1" passes="16" skipped="0"  tests="17" time="1"> 
    <testsuite disabled="0" id="0" name="Bok" time="1" tests="4"> 
     <testcase classname="XYZ" name="description" Plate="blah" Distance="A" Side="L" Angle="15" failure="PASSED"> 
      <system-out/> 
      <system-err/> 
     </testcase> 
     <testcase classname="XYZ" name="description" Plate="blah" Distance="A" Side="L" Angle="60" failure="PASSED"> 
      <system-out/> 
      <system-err/> 
     </testcase> 
     <testcase classname="XYZ" name="description" Plate="blah" Distance="A" Side="L" Angle="30" failure="PASSED"> 
      <system-out/> 
      <system-err/> 
     </testcase> 
     <testcase classname="XYZ" name="description" Plate="blah" Distance="A" Side="L" Angle="60" failure="PASSED"> 
      <system-out/> 
      <system-err/> 
     </testcase> 
    </testsuite> 
    ... and so one 

編集:ここでは

<xsl:for-each select="testsuites/testsuite/testcase"> 
    <xsl:if test="@failure='PASSED'"> 
     <tr style="color:green;font-weight:bold"> 
      <td style="text-align:center"> 
       <xsl:value-of select="@classname" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@name" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@Plate" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@Distance" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@Side" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@Angle" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="@failure" /> 
      </td> 
      <td style="text-align:center"> 
       <xsl:value-of select="failure/@message" /> 
      </td> 
     </tr> 
    </xsl:if> 
    ... and so one 

私のXMLファイルの一部である:ここで

は、それが現時点でどのように見えるかです@(name(@*[1]))に角括弧と名前が必要です。それは私にとっては大丈夫です。

さて問題はのは、7を言わせするには、1から反復要素になりますループを作る方法で、私はこのような何か意味:コメントで述べたように

<xsl:for-each select="$var=1 to 7"> 
    <td style="text-align:center"> 
     <xsl:value-of select="@*[$var]" /> 
    </td> 
</xsl:for-each> 
+0

サンプルの失敗は最初の属性ではありませんが、実際には失敗はなく失敗です。 – derloopkat

+0

@derloopkat属性は、とにかく順序付けされていないので、ソースコード中の順序は何も意味しません。 – Tomalak

+0

あなたは最初の属性値がほしいと言ったのです – derloopkat

答えて

1

このXSLTを試してみてください。 一般に、XML要素に含まれる各属性の値を順番に取得したいと考えています。 CurrentlzはXSLTとIでハードコードされています 私のXMLファイルが変更されると、XSLTはその仕事をしません。

入力XMLの形式を変更して、実際に心配する必要があるものを今では説明していますか?それについて考えてみてください。いずれにしても、既存の変換が入力XMLフォーマットへの変更の事実で正しく機能するかどうかは、変換のジョブがどのようなものになるのか、どのような変更方法が発生するかによって異なります。

特定の順序でフィールドの特定のセットを提示するのが仕事であれば、それは自分の仕事がすばらしくなるように見えます。特に、入力文書に表示される順序に関係なく、選択したフィールドを一貫した順序で表示し、実際には存在しない属性の空のセルを表示します。出力が人間の消費を目的としている場合は、おそらくすべてのものでしょう。 I

は、要素の最初の属性値を取得するために ようなものを使用しようとしたが、それは動作しません。

@TimCは答えました。@(名前(@ * [1])には大括弧と名前は必要ありません) といいです。

今の問題は、あなたが本当にこれは、その後の手続きプログラマのような思考を停止行いたい場合のは、7

番号を言わせるために1から反復要素 になりますループを作る方法です。 XSLTにはループがありませんそれ自体はです。その動作モードは、1つまたは複数のノードを選択し、次にそれぞれをテンプレートをインスタンス化するためのコンテキストとして使用することを含む。ソートディレクティブがない場合、ノードはドキュメント順に処理されます。あなたは、必要以上に困難にしようとしています。

<xsl:for-each select="@*"> 
    <td style="text-align:center"> 
     <xsl:value-of select="." /> 
    </td> 
</xsl:for-each> 

あなただけの最初の7を処理したい場合は、かかわらず:例えば

、あなたは各<テストケース>コンテキストノードのすべての属性を処理したい場合は、あなたが必要とするすべては、このようなものです

<xsl:for-each select="@*[position() < 8]"> 
    <td style="text-align:center"> 
     <xsl:value-of select="." /> 
    </td> 
</xsl:for-each> 

を他の一方で、あなたはその多くの属性があるかどうか、あなたが各テストケースについて、正確に7 < TD>要素を発するようにしたい、場合:選択して、それを指定するどのように多く、その後、そこにあるのそうでなければ、どちらか は

...

<xsl:call-template name="iterate-testcase-attributes"> 
    <xsl:with-param name="up-to" select="7"/> 
</xsl:call-template> 

:あなたは多分、このような何かを反復処理を実行するためのテンプレートを作成する必要が

<td style="text-align:center"> 
    <xsl:value-of select="@*[1]" /> 
</td> 
<td style="text-align:center"> 
    <xsl:value-of select="@*[2]" /> 
</td> 
<!-- ... --> 

またはその他:バックあなたの元XSLの線に沿って何かをしています

<xsl:template name="iterate-testcase-attributes"> 
    <xsl:param name="current" select="1"/> 
    <xsl:param name="up-to" select="1"/><!-- the select value is only a default --> 
    <td style="text-align:center"> 
    <!-- will produce nothing if the context node has no such attribute --> 
    <xsl:value-of select="@*[position() = $current]" /> 
    </td> 
    <xsl:if test="$current < $up-to"> 
    <xsl:call-template name="iterate-testcase-attributes"> 
     <xsl:with-param name="current" select="$current + 1"/> 
     <xsl:with-param name="up-to" select="$up-to"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 
+0

あなたのアドバイスありがとうございました、私はそれらをよく見なければなりません、一般的に私はXSLTコーディングに慣れていませんそういうわけで私は質問します;) – asdator1213

+0

私の意図は、誰かがXMLにそれほど多くの新しい属性を追加した後に、多くの変更を必要としないXSLTを作成することでした。 もう一度お返事ありがとうございます。 – asdator1213

+0

@ asdator1213、私はあなたが、(1)現在期待されている属性の1つが提供されていない、または(2)追加の属性が提供されている場合に、 、または(3)あなたが見るのに慣れていたのとは異なる順序で属性が提示されている。それがなければ、あなたは候補スタイルシートを評価する方法がありません。 –

0

を、XMLの属性非順序付けられ。あなたは関係なく、すべての順序の属性を取得したい場合は、あなたがこれを行うことが...

<xsl:for-each select="@*"> 
    <td style="text-align:center"> 
    <xsl:value-of select="." /> 
    </td> 
</xsl:for-each> 

しかし、複数のtestcase要素と、各列の属性は同じ順序である保証はありません。しかし、本当にXSLTを可能な限り一般的なものにしたいのであれば、最初の行に基づいて注文することができます。

は、私は「HTMLを作るためにXSLTを使用してXMLファイルをフォーマットすると問題を抱えてまし

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <table border="1"> 
     <xsl:variable name="attrs" select="testsuites/testsuite[1]/testcase[1]/@*" /> 
     <tr> 
     <xsl:for-each select="$attrs"> 
      <th> 
      <xsl:value-of select="local-name()" /> 
      </th> 
     </xsl:for-each> 
     </tr> 
     <xsl:for-each select="testsuites/testsuite/testcase[@failure='PASSED']"> 
     <xsl:variable name="currentCase" select="." />  
     <tr style="color:green;font-weight:bold"> 
      <xsl:for-each select="$attrs"> 
      <xsl:variable name="currentAttr" select="local-name()" />  
      <td style="text-align:center"> 
       <xsl:value-of select="$currentCase/@*[local-name() = $currentAttr]" /> 
      </td> 
      </xsl:for-each> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 
+0

あなたの答えをありがとう;) – asdator1213

関連する問題