2017-06-30 5 views
1

次のPHPコードをxsltに変換しようとしています。 XSLではxsl selectの値を使ってループ内の別の値を選択する

$columns = [a,b,c]; 
$records = [[a,b,c][a,b,c][a,b,c]]; 

foreach($records as $records){ 
    echo "<tr>"; 
    foreach($columns as $col){ 
    echo $records[$col]; 
    } 
    echo "</tr>"; 
} 

私はそれは私のために働いていない、私は空白のページを取得するには、次の

      <thead> 
           <xsl:for-each select="/response/body/recordset/columns"> 
            <th> 
            <xsl:value-of select="current()"/> 
            </th> 
           </xsl:for-each> 
          </thead> 
          <xsl:for-each select="/response/body/recordset/record"> 
           <xsl:variable name="journeyDetails" select="."/> 
           <tr> 
            <xsl:for-each select="/response/body/recordset/columns"> 
             <td>            
              <xsl:value-of /><xsl:attribute name="select">$journeyDetails/<xsl:value-of select="current()"/></xsl:attribute> 
             </td> 
            </xsl:for-each> 

           </tr> 

          </xsl:for-each> 

を持っています。私はxsl forループが間違っていると信じています。私は、同様のデータでこのスタイルシートを使用できるように、動的にテーブルを作成しようとしています

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="/xslt/user_audit_view.xsl"?> 
<response> 
    <header> 
    </header> 
    <body> 
    <recordset> 
     <record> 
     <ID>201</ID> 
     <O_ENTITY_ID>1</O_ENTITY_ID> 
     <O_LOCATION_ID></O_LOCATION_ID> 
     <O_NAME>sharif</O_NAME> 
     <O_CREATED_BY>UddinS2</O_CREATED_BY> 
     <O_UPDATED_BY>UddinS2</O_UPDATED_BY> 
     <N_ENTITY_ID></N_ENTITY_ID> 
     <N_LOCATION_ID></N_LOCATION_ID> 
     <N_NAME></N_NAME> 
     <N_CREATED_BY></N_CREATED_BY> 
     <N_UPDATED_BY></N_UPDATED_BY> 
     <ACTION>DELETE</ACTION> 
     <USERNAME>test</USERNAME> 
     <TABLE_ID>181</TABLE_ID> 
     <O_TS_CREATED>28-Jun-17 10:36:53</O_TS_CREATED> 
     <N_TS_CREATED></N_TS_CREATED> 
     <TS_CREATED>28-Jun-17 15:48:45</TS_CREATED> 
     </record> 
    <columns>ID</columns> 
     <columns>O_ENTITY_ID</columns> 
     <columns>O_LOCATION_ID</columns> 
     <columns>O_NAME</columns> 
     <columns>O_CREATED_BY</columns> 
     <columns>O_UPDATED_BY</columns> 
     <columns>O_TS_CREATED</columns> 
     <columns>N_ENTITY_ID</columns> 
     <columns>N_LOCATION_ID</columns> 
     <columns>N_NAME</columns> 
     <columns>N_CREATED_BY</columns> 
     <columns>N_UPDATED_BY</columns> 
     <columns>N_TS_CREATED</columns> 
     <columns>ACTION</columns> 
     <columns>USERNAME</columns> 
     <columns>TABLE_ID</columns> 
     <columns>TS_CREATED</columns> 
    </recordset> 
    </body> 
</response> 

How do I access elements from the outer loop from within nested loops?

XML、ここからの例を使用しようとしました。私はテーブルの中でtheadになり、レコードはtbodyのデータである列を渡しています。私は、スタイルシートに列名を明示的に指定しなくても、各列の各列の値を正しい列見出しの下に置くことができるようにしたいと考えています。

+0

はありますか?ありがとう! –

+0

がxmlサンプルを追加 – shorif2000

答えて

0
<xsl:value-of /><xsl:attribute name="select">$journeyDetails/<xsl:value-of select="current()"/></xsl:attribute> 

あなたはこの言語の仕組みについて完全に間違った精神モデルを開発したと思います。私はxsl:attributeを使用しようとしていると思います。結果ツリーに属性ノードを作成するのではなく、スタイルシート自体に属性を作成し、この属性が評価され結果が結果ツリーに追加されることを期待しています。

XSLTは最新のプログラミング言語に似ています。実行中にプログラムを変更することはできません。

XSLT 3.0の場合は、文字列から動的にXPath式を構成して評価します。その構文はxsl:evaluate命令です。 XSLT 3.0より前のXSLTプロセッサの中には、同様のことをするベンダー拡張があります。私はあなたがその能力を必要としていることを非常に疑っています。しかし、あなたの入力と出力がどのようになっているのかを知らないと、アドバイスするのはむずかしいです。 (あなたの唯一の要求文はPHPコードであり、私はPHPを知らない)。

+0

私は何をしようとしているものに更新を加えました – shorif2000

1

あなたが後にある式はこれです...

<xsl:value-of select="$journeyDetails/*[name() = current()]" /> 

はすなわち、現在の列の値と同じ名前を持つ$ journeyDetailsノードの子要素を検索します。

ここでは、あなたの入力XMLのサンプルを表示するには、あなたの質問を編集することができ、完全なXSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
    <table border="1"> 
    <thead> 
     <tr> 
     <xsl:for-each select="/response/body/recordset/columns"> 
     <th> 
      <xsl:value-of select="current()"/> 
     </th> 
     </xsl:for-each> 
     </tr> 
    </thead> 
    <tbody> 
    <xsl:for-each select="/response/body/recordset/record"> 
     <xsl:variable name="journeyDetails" select="."/> 
     <tr> 
     <xsl:for-each select="/response/body/recordset/columns"> 
      <td>            
      <xsl:value-of select="$journeyDetails/*[name() = current()]" /> 
      </td> 
     </xsl:for-each>  
     </tr> 
    </xsl:for-each> 
    </tbody> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 
関連する問題