6

次のような階層 XML を変換するには、一般的な方法が必要です。

<element1 A="AValue" B="BValue">
   <element2 C="DValue" D="CValue">
      <element3 E="EValue1" F="FValue1"/>
      <element3 E="EValue2" F="FValue2"/>
   </element2>
   ...
</element1>

フラット化された XML (html) に変換して、途中で選択した属性を取得し、列ヘッダーになる属性にさまざまなラベルを提供します。

<table>
   <tr>
     <th>A_Label</th>
     <th>D_Label</th>
     <th>E_Label</th>
     <th>F_Label</th>
   </tr>
   <tr>
     <td>AValue</td>
     <td>DValue</td>
     <td>EValue1</td>
     <td>FValue1</td>
   </tr>
   <tr>
     <td>AValue</td>
     <td>DValue</td>
     <td>EValue2</td>
     <td>FValue2</td>
   </tr>
<table>

OK、属性の再ラベル付けによる一般的な解決策はありませんが、うまくいけば私の言いたいことが理解できます。すべての XSLT/XPATH の作業を開始したばかりなので、すぐに解決できますが、手がかりは役に立ちます。

4

5 に答える 5

5

あなたが何をしようとしているのか100%確信が持てませんが、要素1、要素2、および要素3が一貫してネストされている場合、このソリューションは機能する可能性があります。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="element3">
        <tr>
            <td><xsl:value-of select="../../@A"/></td>
            <td><xsl:value-of select="../../@B"/></td>
            <td><xsl:value-of select="../@C"/></td>
            <td><xsl:value-of select="../@D"/></td>
            <td><xsl:value-of select="@E"/></td>
            <td><xsl:value-of select="@F"/></td>
        </tr>
        <xsl:apply-templates select="*"></xsl:apply-templates>
    </xsl:template>

</xsl:stylesheet>
于 2008-09-18T00:19:31.657 に答える
1

同様のXSLTが必要でしたが、深さが不明です。これが私が行った方法です。

まず、結果の HTML テーブル/定義リストのラッパーを追加し、テンプレート mode="puke" を呼び出して XML ツリーをフラット化します。

<xsl:element name="div">
    <xsl:attribute name="class" select="puke" />
    <xsl:apply-templates select="$notice" mode="puke" />
</xsl:element>  

ここでは、各ノードを照合して、そのコンテンツ (例: text()) とその属性を表示します。これを再帰的に行います。ソース ツリーが複雑なツリーであり、.dl/dt/dd を使用したため、.

<!-- @description: 
    Display all field from the notice so the customer can tell what he want
-->
<xsl:template match="node()" mode="puke">
<xsl:message>
    puking : <xsl:value-of select="local-name( . )" />
</xsl:message>
    <xsl:element name="dl">
        <xsl:element name="dt">
            <xsl:attribute name="class">tagName</xsl:attribute> 
            <xsl:value-of select="local-name( . )" />
        </xsl:element>
        <xsl:element name="dd">
            <xsl:attribute name="class">tagText</xsl:attribute>
            <xsl:value-of select="text()" /></xsl:element> 
        <xsl:element name="dl">
            <xsl:attribute name="class">attr</xsl:attribute>
            <!-- display attribute -->
            <xsl:apply-templates select="@*" />
        </xsl:element>
    </xsl:element>
    <!-- recursive call on node() -->
    <xsl:apply-templates select="./*" mode="puke" />    
</xsl:template>

指定したノードの属性を一致させて表示します。

結果の HTML をフォーマットするために使用する CSS :

<style>
.puke {
    background-color: #BDD6DE;
    clear: both;
}
.tagName, .attrName {
    float: left;
}
.tagText, .attrText {
    clear: right;
}
</style>
于 2012-08-02T15:09:58.873 に答える
0

元の質問を明確にする必要があります。

  • 元の質問の BValue と CValue はどうなりますか? それらが平坦化された構造の一部であってはならない理由はありますか?
  • XML ドキュメントのすべての要素に 2 つの属性がありますか、それとも完全に恣意的ですか?
  • 要素は 3 種類しかなく、例に示すように常にネストされていますか?
  • element1 自体を繰り返すことはできますか、それともドキュメントのルート要素ですか?

XSLT では、非常に一般的なトランスフォーマーを作成できますが、既知の制限を考慮に入れることができれば、ドキュメントを変換するスタイルシートを作成する方がはるかに簡単です。

于 2008-09-18T05:54:24.740 に答える
0

Oracleデータベースから読み取るPro*Cプログラムがすでにあります。これはperlスクリプトを呼び出し、Javaを実行して前述のデータベースからXML形式のデータを抽出し、バッチファイルを呼び出してvbscriptを実行し、ファイルを別のファイルにFTP転送しますサーバ。Fortranで何かを本当に望んでいました。

于 2008-09-18T00:17:37.107 に答える
0

以下のテンプレートの拡張バージョンを使用して、構造化された XML をフラット化しました。警告: 元のバージョン (実際には XML を CSV に変換したもの) にはケース固有のコードがいくつかありましたが、それを削除しただけで、このバージョンはテストしていません。

それが機能する基本的な方法は明確です。ノードの子を持たないものはすべて出力し、それ以外の場合は、子を持つ node() でテンプレートを再帰的に呼び出します。現在のように属性とコメントを正しく処理しているとは思いませんが、修正するのは難しくありません。

<?xml version="1.0" encoding="UTF-8"?>

<!-- XSL template to flatten structured XML, before converting to CSV. -->
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <xsl:strip-space elements="*" /> 

    <xsl:template match="/">
        <xsl:apply-templates select="//yourElementsToFlatten"/>
    </xsl:template>

    <xsl:template match="//yourElementsToFlatten">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:choose>
            <!-- If the element has multiple childs, call this template 
                on its children to flatten it-->
            <xsl:when test="count(child::*) > 0">
                <xsl:apply-templates select="@*|node()"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:value-of select="text()" />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>
于 2008-09-18T09:47:04.460 に答える