1

ノードの名前がわからない場合、XSTL を使用して XML ドキュメントを変換するにはどうすればよいですか。したがって、基本的には、あらゆる XML ドキュメントで普遍的に機能するはずです。

次の XML ドキュメントを取得したとします。

<?xml version="1.0"?>
<?xml-stylesheet href="transform.xsl" type="text/xsl" ?>
<!DOCTYPE cinema [
<!ELEMENT a (b*)>
<!ELEMENT b (c,d,e)>
<!ELEMENT c (#PCDATA)>
<!ELEMENT d (#PCDATA)>
<!ELEMENT e (#PCDATA)>
]>

<cinema>
<movie>
    <actor>Some actor</actor>
    <title>Some title</title>
    <year>Some year</year>
</movie>
</cinema>

これからHTMLテーブルを作成するにはどうすればよいですか? 次のようにルート要素を一致させることができることはわかっています。

<xsl:template match="/">

次に、次のようにすべての映画を選択します。

<xsl:for-each select="/*/*">

しかし、映画ごとに 1 つの行を取得し、俳優、タイトル、年の 3 つの列を取得するにはどうすればよいでしょうか? 特に、XML ファイル (ムービー) は 2 つまたは 5 つの子しか持つことができないためです。

+++編集+++

私がこれを行う場合:

<tr>
    <td><xsl:value-of select="."/></td>
</tr>

各映画の詳細を 1 行で取得します。これは私が達成したいものにほぼ近いです。しかし、映画の詳細をその行の 3 つの列に広げるにはどうすればよいでしょうか?

4

3 に答える 3

2

常に 3 つのレベルの要素 (ルート、子、孫) があることがわかっている場合は、次のようにする必要があります。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" />

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

  <xsl:template match="/*">
    <table><xsl:apply-templates /></table>
  </xsl:template>

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

  <xsl:template match="/*/*/*">
    <td><xsl:apply-templates /></td>
  </xsl:template>
</xsl:stylesheet>

/テンプレートは、ドキュメント ノードに一致し、ドキュメント ノードの第/*1 レベルの要素の子 (つまり、ドキュメントのルート要素) に/*/*一致し、第 2 レベルの子に一致します。

<xsl:apply-templates/>( noselectを使用) は、一致するテンプレートを現在のノードのすべての子ノードに適用します。これには、子要素、テキスト ノード、コメント、および処理命令が含まれます。その結果、ルート テンプレートを

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

要素のみを選択します。

于 2012-12-12T14:40:58.833 に答える
1

サンプルXML:

<?xml version="1.0" encoding="utf-8"?>
<cinema>
  <movie>
    <actor>Some actor</actor>
    <title>Some title</title>
    <year>Some year</year>
  </movie>
  <movie>
    <actor>Someother actor</actor>
    <title>Someother title</title>
    <year>Someother year</year>
  </movie>
</cinema>

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
      <table>
        <xsl:for-each select="*/*">
          <xsl:if test="position()=1">
            <tr>
              <th>actor</th>
              <th>title</th>
              <th>year</th>
            </tr>
          </xsl:if>
          <tr>
            <xsl:for-each select="actor|title|year">
              <td>
                <xsl:value-of select="."/>
              </td>
            </xsl:for-each>
          </tr>
        </xsl:for-each>
      </table>
    </xsl:template>
</xsl:stylesheet>

出力:

<?xml version="1.0" encoding="utf-8"?>
<table>
  <tr>
    <th>actor</th>
    <th>title</th>
    <th>year</th>
  </tr>
  <tr>
    <td>Some actor</td>
    <td>Some title</td>
    <td>Some year</td>
  </tr>
  <tr>
    <td>Someother actor</td>
    <td>Someother title</td>
    <td>Someother year</td>
  </tr>
</table>
于 2012-12-12T14:48:30.727 に答える
0

使用

<xsl:template match="movie">
 <!-- Specify your tr-producing code here -->
</xsl:template>
于 2012-12-12T14:14:50.737 に答える