3

正直なところ、これは私にとって初めての XML プロジェクトですが、自分で答えを探すのに飽きてきました。アドレス帳を作成しようとしています。連絡先データを XML ファイルに保存し、変換された XSLT スタイル シートから取り出して単純なテーブルを作成します。これが私のファイルのコピーです。助けていただければ幸いです。ありがとう。

XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="contactdata.xsl"?>

<!DOCTYPE addressbook [
<!ELEMENT addressbook (contact)>
<!ELEMENT contact (fname,lname,mi,staddress,city,state,zip,phone,email,twitter)>
<!ELEMENT fname (#PCDATA)>
<!ELEMENT lname (#PCDATA)>
<!ELEMENT mi (#PCDATA)>
<!ELEMENT staddress (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!ELEMENT state (#PCDATA)>
<!ELEMENT zip (#PCDATA)>
<!ELEMENT phone (#PCDATA)>
<!ELEMENT email (#PCDATA)>
<!ELEMENT twitter (#PCDATA)>
]>

<addressbook>
<contact>
<fname>Peyton</fname>
<lname>Manning</lname>
<mi>Z</mi>
<staddress>123 Go Vols</staddress>
<city>Denver</city>
<state>CO</state>
<zip>12345</zip>
<phone>1-800-youwish</phone>
<email>pmanning@broncos.com</email>
<twitter>peyton_manning</twitter>
</contact>

<contact>
<fname>Eric</fname>
<lname>Berry</lname>
<mi>P</mi>
<staddress>123 Arrowhead Stadium</staddress>
<city>Kansas City</city>
<state>MO</state>
<zip>34567</zip>
<phone>816-213-4452</phone>
<email>eberry@chiefs.com</email>
<twitter>eric_berry</twitter>
</contact>
</addressbook>

そして私のXSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="sitetemplate.css"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<table>
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Middle Initial</th>
<th>Street Address</th>
<th>City</th>
<th>State</th>
<th>Zip</th>
<th>Phone</th>
<th>Email</th>
<th>Twitter</th>
</tr>
<xsl:for-each select="addressbook/contact">
    <tr>
      <td><xsl:value-of select="fname"/></td>
      <td><xsl:value-of select="lname"/></td>
      <td><xsl:value-of select="mi"/></td>
      <td><xsl:value-of select="staddress"/></td>
      <td><xsl:value-of select="city"/></td>
      <td><xsl:value-of select="state"/></td>
      <td><xsl:value-of select="zip"/></td>
      <td><xsl:value-of select="phone"/></td>
      <td><xsl:value-of select="email"/></td>
      <td><xsl:value-of select="twitter"/></td>

      </tr>
      </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

また、最初の行が生成された時点でコードがどのように記述されているかについて言及したいと思いますが、その後テーブルが停止します。

4

2 に答える 2

2

最初の行が生成された今、コードがどのように記述されているかについて言及したいと思いますが、私のテーブルはその後停止します

いいえ、提供された変換は正常に機能しtr、各contact要素に対して 1 つを生成します -- 意図したとおりです

ただし、必要な変換は、はるかに短い方法で表現できます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
    <html>
        <body>
            <table>
                <tr>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Middle Initial</th>
                    <th>Street Address</th>
                    <th>City</th>
                    <th>State</th>
                    <th>Zip</th>
                    <th>Phone</th>
                    <th>Email</th>
                    <th>Twitter</th>
                </tr>
                <xsl:apply-templates/>
            </table>
        </body>
    </html>
 </xsl:template>

 <xsl:template match="contact">
  <tr><xsl:apply-templates/></tr>
 </xsl:template>

 <xsl:template match="contact/*">
  <td><xsl:value-of select="."/></td>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<addressbook>
    <contact>
        <fname>Peyton</fname>
        <lname>Manning</lname>
        <mi>Z</mi>
        <staddress>123 Go Vols</staddress>
        <city>Denver</city>
        <state>CO</state>
        <zip>12345</zip>
        <phone>1-800-youwish</phone>
        <email>pmanning@broncos.com</email>
        <twitter>peyton_manning</twitter>
    </contact>
    <contact>
        <fname>Eric</fname>
        <lname>Berry</lname>
        <mi>P</mi>
        <staddress>123 Arrowhead Stadium</staddress>
        <city>Kansas City</city>
        <state>MO</state>
        <zip>34567</zip>
        <phone>816-213-4452</phone>
        <email>eberry@chiefs.com</email>
        <twitter>eric_berry</twitter>
    </contact>
</addressbook>

必要な正しい結果が生成されます。

<html>
   <body>
      <table>
         <tr>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Middle Initial</th>
            <th>Street Address</th>
            <th>City</th>
            <th>State</th>
            <th>Zip</th>
            <th>Phone</th>
            <th>Email</th>
            <th>Twitter</th>
         </tr>
         <tr>
            <td>Peyton</td>
            <td>Manning</td>
            <td>Z</td>
            <td>123 Go Vols</td>
            <td>Denver</td>
            <td>CO</td>
            <td>12345</td>
            <td>1-800-youwish</td>
            <td>pmanning@broncos.com</td>
            <td>peyton_manning</td>
         </tr>
         <tr>
            <td>Eric</td>
            <td>Berry</td>
            <td>P</td>
            <td>123 Arrowhead Stadium</td>
            <td>Kansas City</td>
            <td>MO</td>
            <td>34567</td>
            <td>816-213-4452</td>
            <td>eberry@chiefs.com</td>
            <td>eric_berry</td>
         </tr>
      </table>
   </body>
</html>

説明:

テンプレート、パターン マッチング、および XSLT 処理モデルの適切な使用。

于 2012-09-16T04:07:57.997 に答える
0

あなたのスタイルシートは私にとってはうまくいきます。

<xsl:for-each>簡単に実行できる場合よりも、再帰的なテンプレート マッチングを使用する方が、xsl ではもう少し標準的な形式です。この場合、それは非常に簡単です。

そのスタイルでは、テンプレートは次のように変更されます。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
  <body>
    <xsl:apply-templates/>
  </body>
</html>
</xsl:template>

<xsl:template match="addressbook">
  <table>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Middle Initial</th>
      <th>Street Address</th>
      <th>City</th>
      <th>State</th>
      <th>Zip</th>
      <th>Phone</th>
      <th>Email</th>
      <th>Twitter</th>
    </tr>
    <xsl:apply-templates/>
  </table>
</xsl:template>


<xsl:template match="contact">
    <tr>
      <td><xsl:value-of select="fname"/></td>
      <td><xsl:value-of select="lname"/></td>
      <td><xsl:value-of select="mi"/></td>
      <td><xsl:value-of select="staddress"/></td>
      <td><xsl:value-of select="city"/></td>
      <td><xsl:value-of select="state"/></td>
      <td><xsl:value-of select="zip"/></td>
      <td><xsl:value-of select="phone"/></td>
      <td><xsl:value-of select="email"/></td>
      <td><xsl:value-of select="twitter"/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>

もちろん、単純なテーブルの場合はどちらでも機能します。しかし、このスタイルは、より複雑な構造でははるかに優れている可能性があるため、学ぶ価値があります。

于 2012-09-16T02:57:01.367 に答える