0

HTML 出力の作成に使用する XSLT ドキュメントにマージしたい、構造の異なる 2 つの XML ドキュメント (以下の例) があります。

私がやりたいことは、次のようなテーブルを作成することです (車の例):

Serialnr    Brand    Color    Year    Price    Condition
 123456     'Opel'   'Blue'   '1978'  '10000$'   'Used'
  ...        ...      ...      ...     ...      ...

これらのうち最後の 2 つ (Price と Condition) は 2 番目のドキュメント (foo2.xml) にあり、これらのドキュメント間の一致は serialnr です。車はドキュメント内で同じ順序で並べられておらず、foo1.xml よりも (使用されない) foo2.xml に多くの車が存在します。

foo1.xml:

<cars>
    <car>
        <serialnr>123456</serialnr>
        <brand>Opel</brand>
        <color>Blue</color>
        <year>1978</year>
    </car>
    ...and so on...

foo2.xml:

<vehicles>
    <vehicle>
        <cell nr="2"><data nr="3">123456</data></vehicle> // <--- match on serialnr (123456)
        <cell><data nr="3">10000$</data></cell>
        <cell><data nr="3">Used</data></cell>
    ...and so on...

Foo1.xml は、サーバー側で PHP を使用して XSLT ドキュメントに接続され、foo2.xml は XSLT ドキュメントにマージされます (以下を参照)。

車.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">

    <xsl:param name="foo2" select="'foo2.xml'"/>

    <xsl:template match="/">

        <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html></xsl:text>

        <html>
            <head>
                <title>Producers</title>
            </head>
            <body>
                       ...//table, thead, tr, th...

                    <tbody>
                        <xsl:for-each select="//car">
                        <tr>
                            <td>
                                <xsl:value-of select="serialnr" />
                            </td>
                            <td>
                                <xsl:value-of select="brand" />
                            </td>
                            <td>
                                <xsl:value-of select="color" />
                            </td>
                            <td>
                                <xsl:value-of select="year" />
                            </td>
                          </xsl:for-each>
                          <xsl:for-each select="document($foo2)//Vehicle">
                               // I need to match the serialnr in some way to get the correct car's data here, but how?
                               <td>
                                    // Selecting Cell node 2 (price)
                                    //<xsl:value-of select="/? "/>
                               </td>
                               <td>
                                    // Selecting Cell node 3 (condition)
                                    //<xsl:value-of select="/? "/>
                               </td>

それで、どうすればこれを行うことができますか?ここで助けていただければ幸いです。よろしくお願いします!

ノート:

  1. foo2.xml の構造に一貫性がありません。突然、子ノードが「vehicle」から「part」に変わります (つまり、「vehicles/vehicle」から「vehicles/part」)。
  2. foo2.xml には、興味のないデータを含む「車両」ノードがたくさんあるので、何らかの if ステートメントを使用して、ループするときに必要なデータが存在するかどうかをテストする必要がありますか?
4

1 に答える 1

1

メインのコメント フィードに投稿した質問への回答を推測して、この XSLT 1.0 ソリューションを見つけてください。

このドキュメントを主なインプットとして...

<cars>
   <car>
        <serialnr>123456</serialnr>
        <brand>Opel</brand>
        <color>Blue</color>
        <year>1978</year>
  </car>
   <car>
        <serialnr>789</serialnr>
        <brand>Toyota</brand>
        <color>Beige</color>
        <year>2005</year>
  </car>
</cars>  

...そしてこのドキュメントは、パラメータ名でスタイルシートに渡された読み取り可能なドキュメントリソースとしてfoo2...

<vehicles>
  <vehicle>
    <cell><data>123456</data></cell>
    <cell><data>10000$</data></cell>
    <cell><data>Used</data></cell>
  </vehicle>
  <vehicle>
    <cell><data>789</data></cell>
    <cell><data>20000$</data></cell>
    <cell><data>Pre-loved</data></cell>
  </vehicle>

...この XSLT 1.0 スタイルシート...*

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />  

<xsl:param name="foo2" select="'foo2.xml'" />
<xsl:variable name="vehicles" select="document($foo2)/vehicles/vehicle" />

<xsl:template match="/">
 <html lang="en">
   <head><title>Cars</title></head>
   <body>  
     <xsl:apply-templates select="cars" />
   </body>  
 </html>
</xsl:template>

<xsl:template match="cars">
  <table>
    <th>
      <td>Serialnr</td> <td>Brand</td> <td>Color</td> <td>Year</td> <td>Price</td> <td>Condition</td>
    </th>
    <xsl:apply-templates select="car" />
  </table>
</xsl:template>

<xsl:template match="car">
  <xsl:variable name="srl" select="serialnr/text()" />
    <tr>
      <td><xsl:value-of select="$srl" /></td>
      <td><xsl:value-of select="brand" /></td>
      <td><xsl:value-of select="color" /></td>
      <td><xsl:value-of select="year" /></td>
      <td><xsl:value-of select="$vehicles/self::*[cell/data=$srl]/cell[2]" /></td>
      <td><xsl:value-of select="$vehicles/self::*[cell/data=$srl]/cell[3]" /></td>
    </tr>
</xsl:template>

</xsl:stylesheet>

...この出力(HTML5 ドキュメント) が生成されます ...

<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
  <head>
    <META http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Cars</title>
  </head>
  <body>
    <table>
      <th>
        <td>Serialnr</td>
        <td>Brand</td>
        <td>Color</td>
        <td>Year</td>
        <td>Price</td>
        <td>Condition</td>
      </th>
      <tr>
        <td>123456</td>
        <td>Opel</td>
        <td>Blue</td>
        <td>1978</td>
        <td>10000$</td>
        <td>Used</td>
      </tr>
      <tr>
        <td>789</td>
        <td>Toyota</td>
        <td>Beige</td>
        <td>2005</td>
        <td>20000$</td>
        <td>Pre-loved</td>
      </tr>
    </table>
  </body>
</html>

ノート

キーを使用したソリューションも可能です。

于 2012-11-20T11:40:18.883 に答える