1

特定の「ID」の値が多数ある XML ファイルの XSLT に取り組んでいます。これらの値をデータベースに出力するコンバーターを介してこれを実行する必要がありますが、値を識別するために必要なのは ID だけです。値を識別するために必要なのは、別のファイルにある説明です。この説明は、私が現在使用しているものである ID ではなく、出力 XML の要素名になるはずです。同じカウンター ID が別のファイルにあり、要素名として使用する必要がある説明が含まれています。ここに例を示します。念のため、混乱させてしまいます。

<!-- XML with values -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <series>
        <sampleInfo>
            <timestamp>1/1/2013 12:00 AM</timestamp>
            <timestamp>1/2/2013 12:00 AM</timestamp>
            <timestamp>1/3/2013 12:00 AM</timestamp>
            <timestamp>1/4/2013 12:00 AM</timestamp>
        </sampleInfo>
        <value>
            <series>
                <value>
                    <int>0</int>
                    <int>9</int>
                    <int>0</int>
                    <int>9</int>
                </value>
                <id>
                    <counterID>100</counterID>
                    .
                    .
                </id>
            </series>
            <series>
                <value>
                    <int>3</int>
                    <int>6</int>
                    <int>3</int>
                    <int>6</int>
                </value>
                <id>
                    <counterID>120</counterID>
                    .
                    .
                    .
                </id>
            </series>
        </value>
    </series>
</root>

基本的に、各タイムスタンプには、対応するカウンター ID ごとに独自の値があります。ここで、私が情報を取得している別の XML ファイルのサンプルを示します。

<!-- XML with descriptions -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <counterInfo>
        <id>100</id>
        <description>Blah</description>
    </counterInfo>
    <counterInfo>
        <id>120</id>
        <description>Derp</description>
    </counterInfo>
</root>

したがって、元のドキュメント (値を持つドキュメント) を変換すると、出力 (フラット) XML は次のようになります。

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <C100>0</C100> <!-- Since XML doesn't allow numeric element fields, I add a C -->
        <C120>3</C120>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <C100>9</C100>
        <C120>6</C120>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <C100>0</C100>
        <C120>3</C120>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <C100>9</C100>
        <C120>6</C120>
    </element>
</root>

次に、上記のように既にフラットな XML を変換して、代わりにこれを表示する必要があります。

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <Blah>0</Blah>
        <Derp>3</Derp>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <Blah>9</Blah>
        <Derp>6</Derp>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <Blah>0</Blah>
        <Derp>3</Derp>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <Blah>9</Blah>
        <Derp>6</Derp>
    </element>
</root>

私は少し検索を行い、ほとんどの結果はパラメータを示唆していますが、これらを変換する方法はこれを少し難しくするかもしれません. コンバーターの大規模なリポジトリーの一部である Java のコンバーターがあり、そのリポジトリーから XSLT をプルして、渡されたファイルを変換します。コンバーターでは、アーカイブから変換が必要なファイルを抽出し、それぞれを個別に実行します。だから私の問題は...コンバーターがリスト内のそのファイルに到達したときにXSLTにそのファイル名を与えるにはどうすればよいですか?また、そのファイル名をXSLTに渡すにはどうすればよいですか?

それで、私は物事を過度に複雑にしていますか?これを達成する簡単な方法はありますか?何かを片付ける必要がある場合はお知らせください。

4

1 に答える 1

1

ドキュメントを開くのは非常に簡単で、パラメータ化できます。しかし、'C' concat である要素名 (たとえば、'C100') を作成することは、ひどい、ひどい、ひどい考えです。なんで?これらのノードを (xsl で) 見つけるのは非常に難しいためです。また、「C100」「C125」ノードは、スキーマを作成しようとする試みを吹き飛ばします。

独自の要素を作成する代わりに、属性を使用します: <descr id="100">0</descr>

入力 XML (file.xml)

さて、代わりに descr 要素を使用した xml を次に示します。

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <descr id="100">0</descr>
        <descr id="120">3</descr>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <descr id="100">9</descr>
        <descr id="120">6</descr>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <descr id="100">0</descr>
        <descr id="120">3</descr>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <descr id="100">9</descr>
        <descr id="120">6</descr>
    </element>
</root>

説明 XML (descriptions.xml)

<root>
    <counterInfo>
        <id>100</id>
        <description>Blah</description>
    </counterInfo>
    <counterInfo>
        <id>120</id>
        <description>Derp</description>
    </counterInfo>
</root>

XSL

そして最後に、それらをマージするためのスタイル シート:

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

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

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

    <xsl:template match="descr">
      <xsl:variable name="nodeName">
        <xsl:value-of select="document($descrDoc)/*/counterInfo[ id = current()/@id ]/description" />
      </xsl:variable>
      <xsl:if test="string-length($nodeName)=0">
        <xsl:message terminate="yes">No description! Failed.</xsl:message>
      </xsl:if>
      <xsl:element name="{$nodeName}">
        <xsl:apply-templates />
      </xsl:element>
    </xsl:template>

</xsl:stylesheet>
于 2013-03-05T18:29:41.490 に答える