2017-10-24 3 views
2

の欄に記入がここでXMLの簡素化抜粋です:XSLでXMLファイルをループし、データ

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.xsl"?> 
<MeetingWorkBook> 
    <Meeting BookmarkId="0" PageBreak="0" NumberClasses="1" SpecialEvent="0"> 
     <Date ThisWeek="W20171106" NextWeek="W20171113">November 6-12</Date> 
     <MeetingDate Day="9" DayShort="Thu" DayFull="Thursday" Month="11" MonthShort="Nov" MonthFull="November" Year="2017"/> 
    </Meeting> 
    <Meeting BookmarkId="1" PageBreak="0" NumberClasses="1" SpecialEvent="0"> 
     <Date ThisWeek="W20171113" NextWeek="W20171120">November 13-19</Date> 
     <MeetingDate Day="16" DayShort="Thu" DayFull="Thursday" Month="11" MonthShort="Nov" MonthFull="November" Year="2017"/> 
    </Meeting> 
    <Meeting BookmarkId="2" PageBreak="0" NumberClasses="1" SpecialEvent="0"> 
     <Date ThisWeek="W20171120" NextWeek="W20171127">November 20-26</Date> 
     <MeetingDate Day="23" DayShort="Thu" DayFull="Thursday" Month="11" MonthShort="Nov" MonthFull="November" Year="2017"/> 
    </Meeting> 
    <Meeting BookmarkId="3" PageBreak="0" NumberClasses="1" SpecialEvent="0"> 
     <Date ThisWeek="W20171127" NextWeek="W20171204">November 27–December 3</Date> 
     <MeetingDate Day="30" DayShort="Thu" DayFull="Thursday" Month="11" MonthShort="Nov" MonthFull="November" Year="2017"/> 
    </Meeting> 
</MeetingWorkBook> 

これは、いくつかの抽出XSLスクリプト:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:attribute name="lang"> 
     <xsl:value-of select="//Settings//LanguageCode"/> 
     </xsl:attribute> 
     <xsl:attribute name="dir"> 
     <xsl:value-of select="//Settings/Direction"/> 
     </xsl:attribute> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.css"/> 
     <title> 
      <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> 
     </title> 
     </head> 
     <body> 
     <div class="containerPage"> 
      <xsl:for-each select="MeetingWorkBook/Meeting"> 
      </xsl:for-each> 
     </div> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

さて、今まで、私は毎回forループを使って、毎回1​​つずつ処理してきました。私は基本的に1週間目のデータのテーブルを作成し、次に2週間目のデータのテーブルを作成します。

私のユーザーの一人が、より凝縮された方法でデータを準備するXSLスクリプトを使用できるかどうか尋ねました。例えば:あなたが見ることができるように

New Report

、彼は代わりに週ごとのテーブルの1列を使用したいと考えています。私はこれについてどうやって行くことができるか分かりません。テーブルと各行(各行は割り当て)を作成するときに、セルを入力する必要があります。リスト内の各週から1つです。

私はこの問題の説明を過度に複雑にしていると思います。

(XMLファイルの構文を変更せずに)自分の望みを達成するために、XMLをXSLでナビゲートすることはできますか?

更新

私はこれを試してみましたが、私はそれにアプローチするための最良の方法である場合でも、わからない:あなたは、それは一種の作品が、私見ることができるように

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:attribute name="lang"> 
     <xsl:value-of select="//Settings//LanguageCode"/> 
     </xsl:attribute> 
     <xsl:attribute name="dir"> 
     <xsl:value-of select="//Settings/Direction"/> 
     </xsl:attribute> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.css"/> 
     <title> 
      <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> 
     </title> 
     </head> 
     <body> 
     <table> 
      <!--Date--> 
      <tr> 
      <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[1]/Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[2]/Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[3]/Date" /> 
      </td> 
      <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[4]/Date" /> 
      </td> 
      <!--But there might be a 5th element - How to check?--> 
      </tr> 
      <!--Process next row--> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Results

条件付きでリストの項目数に基づいて5番目の列を処理する必要があります。それをする方法を知らない。

さらに、私はこれには重複したコードがたくさんあることがわかります。

私はもう一度xsl:for-eachを使ってみました。私はmodeを渡すことができると思った。それが偉大だと思ったら、私はそれが何を表示したいのか分かりました。しかしmodeを渡すことはできません。

は、私が正しい方向に行くとどのようにそれがよりモジュラー行うことができるのですか?

アップデート2

私はcountコマンドを使用してみましたが、私はそれが間違ってやっている:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:attribute name="lang"> 
     <xsl:value-of select="//Settings//LanguageCode"/> 
     </xsl:attribute> 
     <xsl:attribute name="dir"> 
     <xsl:value-of select="//Settings/Direction"/> 
     </xsl:attribute> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.css"/> 
     <title> 
      <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> 
     </title> 
     </head> 
     <body> 
     <table> 
      <!--Date--> 
      <tr> 
      <xsl:if test="MeetingWorkBook/Meeting[count(*) &gt;= 1]"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[1]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="MeetingWorkBook/Meeting[count(*) &gt;= 2]"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[2]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="MeetingWorkBook/Meeting[count(*) &gt;= 3]"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[3]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="MeetingWorkBook/Meeting[count(*) &gt;= 4]"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[4]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="MeetingWorkBook/Meeting[count(*) &gt;= 5]"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[5]/Date" /> 
       </td> 
      </xsl:if> 
      </tr> 
      <!--Process next row--> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

アップデート3

OK、私は正しくcount機能を使用する方法を働いています:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:attribute name="lang"> 
     <xsl:value-of select="//Settings//LanguageCode"/> 
     </xsl:attribute> 
     <xsl:attribute name="dir"> 
     <xsl:value-of select="//Settings/Direction"/> 
     </xsl:attribute> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.css"/> 
     <title> 
      <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> 
     </title> 
     </head> 
     <body> 
     <table> 
      <!--Date--> 
      <tr> 
      <xsl:if test="count(MeetingWorkBook/Meeting) &gt;= 1"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[1]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="count(MeetingWorkBook/Meeting) &gt;= 2"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[2]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="count(MeetingWorkBook/Meeting) &gt;= 3"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[3]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="count(MeetingWorkBook/Meeting) &gt;= 4"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[4]/Date" /> 
       </td> 
      </xsl:if> 
      <xsl:if test="count(MeetingWorkBook/Meeting) &gt;= 5"> 
       <td> 
       <xsl:value-of select="MeetingWorkBook/Meeting[5]/Date" /> 
       </td> 
      </xsl:if> 
      </tr> 
      <!--Process next row--> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

したがって、質問はまだ残っていますこれを行う最も効率的な方法は?私は各行で最大5つのセルに対して同様のコードを繰り返さなければならないでしょう。各行では、meetingノードの特定の情報にアクセスする必要があります。最初の行で私は日付にアクセスしました。しかし、次の行ではChairmanの値にアクセスします。

テンプレートを使用して情報の各ビットごとにコードを入力するだけで済むように、これを簡単にすることはできますか?

私はここで理にかなっています。残りのスクリプトをすべて追加する前に、ロジックをシンプルかつ効率的にしたいだけです。

ありがとうございました。

+2

人々が否定的な投票に行く場合、私は心から質問して建設的な批判を提供するように丁寧に頼むことができますか?否定的な票が私たちの評判に影響を与えるので、何かを尋ねていることや何を尋ねているかについて何かを学ばなければならない場合は、コメントを歓迎します。私はそれが単に落胆している否定的な投票よりも役に立つと感じています。ありがとう。 –

+1

あなたの書き込みは非常に良好でした。がんばろう。 – Bluewood66

+0

[tag:xpath]を代わりに使用してみませんか? – SaidbakR

答えて

1

これはより効率的な場合があります。テンプレートマッチで*を使用したことに注意してください。したがって、同じテンプレートを使用して次の行を作成することができます。しかし、Dateを指定して、次の行の別のテンプレートを作成することもできます。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <xsl:output method="html" indent="yes" version="4.01" 
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" 
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/> 
    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <xsl:attribute name="lang"> 
     <xsl:value-of select="//Settings//LanguageCode"/> 
     </xsl:attribute> 
     <xsl:attribute name="dir"> 
     <xsl:value-of select="//Settings/Direction"/> 
     </xsl:attribute> 
     <head> 
     <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
     <link rel="stylesheet" type="text/css" href="Workbook-S-140-PublicTalk-WatchtowerStudy-ServiceTalk.css"/> 
     <title> 
      <xsl:value-of select="//Labels/Congregation"/>&#160;<xsl:value-of select="//Labels/Title" /> 
     </title> 
     </head> 
     <body> 
     <table> 
      <!--Date--> 
      <tr> 
      <xsl:apply-templates select="MeetingWorkBook/Meeting/Date"/> 
      </tr> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <!-- column mode--> 
    <xsl:template match="*"> 
    <td> 
     <xsl:value-of select="." /> 
    </td> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題