0

入力 XML ファイルでは、静的列とともに、他のファイル (参照) からのデータを期待する列も使用できます。ただし、参照ごとに、入力 xml には同じ ID または UID を持つ個別の行があります。

出力ファイルには、(ID または UID に基づいて) 1 つの行にすべての参照と関係が含まれている必要があります。

この変換用の XSLT も作成しました。この XSLT は、行数が少ない (< 100 または < 200) 場合に高速です。ただし、カウントが大きくなるにつれて、出力 xml の生成に長い時間がかかります (1000 行のカウントの場合、約 30 分)。

私は使っている

<xsl:for-each select="z:row/@ID[generate-id() = generate-id(key('UniqueID',.))]">

XSLTで。入力 xml の各行に同じ ID があるため、複数の参照 (セクションなど) と関係 (子など) をチェックし、列と同じものを入力する必要があります。

生の XML ファイルを入力します。

<xml xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:z="#RowsetSchema">
<rs:data>
    <z:row UID="PARENT_001_1221AD_A878" GroupID="" GroupRel="" ID="37" Name="Outer Asset Details" RelProduct="Line1" RelUID="CHILD1_101_9899_9POOU99" RelName="CHILD1" RelType="Child" Size="22"/>
    <z:row UID="PARENT_001_1221AD_A878" GroupID="" GroupRel="" ID="37" Name="Outer Asset Details" RelProduct="Line1" RelUID="CHILD2_201_5646546_9890PBS" RelName="CHILD1" RelType="Child" Size="22"/>
    <z:row UID="PARENT_001_1221AD_A878" GroupID="" GroupRel="" ID="37" Name="Outer Asset Details" RelProduct="Line1" RelUID="SEC_999_99565_998AFSD" RelName="Hydraulic Section" RelType="Section" Size="22"/>
</rs:data>

子.xml

<Child xsi:noNamespaceSchemaLocation="../XSD/Child.xsd" FILE="Child" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Row UID="CHILD1_101_9899_9POOU99">
    <Name>CHILD1</Name>
    <Description>This has details about the Hydraulic sections of the automobile</Description>
</Row>
<Row UID="CHILD2_201_5646546_9890PBS">
    <Name>CHILD2</Name>
    <Description>This has details about the manual sections of the automobile</Description>
</Row>

Section.xml

<Section xsi:noNamespaceSchemaLocation="../XSD/Section.xsd" FILE="Section" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Row UID="SEC_999_99565_998AFSD">
    <Name>Hydraulic Section</Name>
    <Description>This has details about the Sections in which the Hydraulic Systems are used.</Description>
</Row>

XSLT ファイル

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" exclude-result-prefixes="s dt z rs msxsl" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="UniqueID" match="z:row/@ID" use="."/>
<xsl:template match="/">
    <Parent xsi:noNamespaceSchemaLocation="../XSD/Parent.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" FILE="Parent">
        <xsl:for-each select="xml">
            <xsl:apply-templates select="rs:data"/>
        </xsl:for-each>
    </Parent>
</xsl:template>
<xsl:template match="rs:data">
    <xsl:for-each select="z:row/@ID[generate-id() = generate-id(key('UniqueID',.))]">
        <xsl:variable name="FRId">
            <xsl:value-of select="current()"/>
        </xsl:variable>
        <xsl:variable name="curNSet" select="//z:row[@ID=$FRId]"/>
        <xsl:copy-of select="current()"/>
        <Record>
            <xsl:attribute name="UID"><xsl:value-of select="$curNSet/@UID"/></xsl:attribute>
            <xsl:element name="Size">
                <xsl:value-of select="$curNSet/@Size"/>
            </xsl:element>
            <xsl:element name="Child">
                <xsl:apply-templates select="$curNSet[@RelType='Child']" mode="Relations">
                    <xsl:with-param name="RelType" select="'Child'"/>
                    <xsl:with-param name="DstFileName" select="'../Files/Child.xml'"/>
                </xsl:apply-templates>
            </xsl:element>
            <xsl:element name="Section">
                <xsl:apply-templates select="$curNSet[@RelType='Section']" mode="References">
                    <xsl:with-param name="RelType" select="'Section'"/>
                    <xsl:with-param name="DstFileName" select="'../Files/Section.xml'"/>
                </xsl:apply-templates>
            </xsl:element>
        </Record>
    </xsl:for-each>
</xsl:template>
<xsl:template match="z:row" mode="Relations">
    <xsl:param name="RelType"/>
    <xsl:param name="DstFileName"/>
    <xsl:element name="{$RelType}">
        <xsl:attribute name="DestinationKey"><xsl:value-of select="@RelUID"/></xsl:attribute>
        <xsl:attribute name="RelFilePath"><xsl:value-of select="$DstFileName"/></xsl:attribute>
        <xsl:attribute name="SequenceNumber"><xsl:value-of select="position()"/></xsl:attribute>
        <xsl:value-of select="@RelName"/>
    </xsl:element>
</xsl:template>
<xsl:template match="z:row" mode="References">
    <xsl:param name="DstFileName"/>
    <xsl:attribute name="DestinationKey"><xsl:value-of select="@RelUID"/></xsl:attribute>
    <xsl:attribute name="RelFilePath"><xsl:value-of select="$DstFileName"/></xsl:attribute>
    <xsl:attribute name="SequenceNumber"><xsl:value-of select="position()"/></xsl:attribute>
    <xsl:value-of select="@RelName"/>
</xsl:template>

Output.xml

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../XSD/Parent.xsd" FILE="Parent" ID="37">
<Record UID="PARENT_001_1221AD_A878">
    <Size>22</Size>
    <Child>
        <Child DestinationKey="CHILD1_101_9899_9POOU99" RelFilePath="../Files/Child.xml" SequenceNumber="1">CHILD1</Child>
        <Child DestinationKey="CHILD2_201_5646546_9890PBS" RelFilePath="../Files/Child.xml" SequenceNumber="2">CHILD1</Child>
    </Child>
    <Section DestinationKey="SEC_999_99565_998AFSD" RelFilePath="../Files/Section.xml" SequenceNumber="1">Hydraulic Section</Section>
</Record>

出力ファイルがより速く生成されるように、XSLT の最適化を手伝ってください。

4

1 に答える 1

1

使用を検討する

<xsl:key name="UniqueID" match="z:row" use="@ID"/>

それから

<xsl:for-each select="z:row/@ID[generate-id() = generate-id(key('UniqueID',.))]">
        <xsl:variable name="FRId">
            <xsl:value-of select="current()"/>
        </xsl:variable>
        <xsl:variable name="curNSet" select="//z:row[@ID=$FRId]"/>

で置き換えることができます

<xsl:for-each select="z:row[generate-id() = generate-id(key('UniqueID', @ID))]">
        <xsl:variable name="FRId" select="@ID"/>

        <xsl:variable name="curNSet" select="key('UniqueID', @ID"/>

変数がまったく必要かどうかはわかりませんが、ネストされた変数の代わりに属性を使用して変数FRIdを定義すると、リソースの消費が確実に少なくなります。selectvalue-of

作る

 <xsl:apply-templates select="$curNSet[@RelType='Child']" mode="Relations">

より効率的にキーを定義する

<xsl:key name="rel" match="z:row" use="concat(@ID, '|', @RelType)"/>

次に使用します

 <xsl:apply-templates select="key('rel', concat(@ID, '|', 'Child')" mode="Relations">

次に、他の適用テンプレートにも同じアプローチを使用します。

上記のすべてはテストされていませんが、アイデアが得られるはずです。

于 2013-08-08T10:59:10.270 に答える