0

置き換えられる既知のタグであるxsltを使用して変換する必要があるという要件がありますが、識別されていないタグは、プロパティバッグ(c#など)のようなモードに入れる必要があります。例えば。以下のXMLを変換したい:

<Envelope>
    <body>
        <MyOperation_reply_data>
            <operation_name>1211</operation_name>
            <operation_short_desc>SCAMA</operation_short_desc>
            <operation_long_desc>C4 SCAM PIECE PART ASSEMBLY
            </operation_long_desc>
            <primary_units>UNITS</primary_units>
            <firstAttribute>123</firstAttribute>
            <sampleone>554</sampleone>
            <area>newarea</area>
            <group>samplegroup</group>
            <whatever>uuu</whatever>
        </MyOperation_reply_data>
    </body>
</Envelope>

この形式に:

<Envelope>
<Body>
    <OperationInfo OperationName="MyOperation">
        <OperationData>
            <Operation>MyOperation</Operation>
            <ShortDescription>MyDescription</ShortDescription>
            <LongDescription>MyLongDescription</LongDescription>
            <PrimaryUnits>UNITS</PrimaryUnits>
            <Attributes>
                <Attribute Name="firstAttribute" Value="123" />
                <Attribute Name="sampleone" Value="554" />
                <Attribute Name="area" Value="newarea" />
                <Attribute Name="group" Value="samplegroup" />
                <Attribute Name="whatever" Value="uuu" />
            </Attributes>
        </OperationData>
    </OperationInfo>
</Body>

操作のみが表示されているように、操作のlong/shortdescriptionとprimaryunitsが認識されたタグです。上記のように属性リストに入れたいものは他にあります。「その他」のタグリストは大きくなる可能性があります。そのため、他のすべてのタグをこのプロパティバッグの種類のモードにすることをお勧めします。

私が抱えている課題は、「その他」のタグをそれぞれまたは識別することができないことです。選択したnot(self :: withまたはステートメント)を試しましたが、あまり役に立ちませんでした。

4

1 に答える 1

1

XSLT 1.0xsl:keyでは、要素の「ホワイトリスト」を作成するために使用できます。

XML入力

<Envelope>
    <body>
        <MyOperation_reply_data>
            <operation_name>1211</operation_name>
            <operation_short_desc>SCAMA</operation_short_desc>
            <operation_long_desc>C4 SCAM PIECE PART ASSEMBLY</operation_long_desc>
            <primary_units>UNITS</primary_units>
            <firstAttribute>123</firstAttribute>
            <sampleone>554</sampleone>
            <area>newarea</area>
            <group>samplegroup</group>
            <whatever>uuu</whatever>
        </MyOperation_reply_data>
    </body>
</Envelope>

XSLT 1.0

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

    <xsl:key name="whiteList" match="*[self::primary_units or 
                                       self::operation_name or
                                       self::operation_short_desc or
                                       self::operation_long_desc]" use="name()"/>

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

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

    <xsl:template match="MyOperation_reply_data">
        <OperationInfo OperationName="{operation_name}">
            <OperationData>
                <xsl:apply-templates select="*[key('whiteList',name())]"/>
                <Attributes>
                    <xsl:apply-templates select="*[not(key('whiteList',name()))]"/>                 
                </Attributes>
            </OperationData>
        </OperationInfo>
    </xsl:template>

    <xsl:template match="operation_name">
        <Operation><xsl:apply-templates/></Operation>
    </xsl:template>

    <xsl:template match="operation_short_desc">
        <ShortDescription><xsl:apply-templates/></ShortDescription>
    </xsl:template>

    <xsl:template match="operation_long_desc">
        <LongDescription><xsl:apply-templates/></LongDescription>
    </xsl:template>

    <xsl:template match="primary_units">
        <PrimaryUnits><xsl:apply-templates/></PrimaryUnits>
    </xsl:template>

    <xsl:template match="MyOperation_reply_data/*[not(key('whiteList',name()))]">
        <Attribute name="{name()}" value="{.}"/>
    </xsl:template>

</xsl:stylesheet>

XML出力

<Envelope>
   <Body>
      <OperationInfo OperationName="1211">
         <OperationData>
            <Operation>1211</Operation>
            <ShortDescription>SCAMA</ShortDescription>
            <LongDescription>C4 SCAM PIECE PART ASSEMBLY</LongDescription>
            <PrimaryUnits>UNITS</PrimaryUnits>
            <Attributes>
               <Attribute name="firstAttribute" value="123"/>
               <Attribute name="sampleone" value="554"/>
               <Attribute name="area" value="newarea"/>
               <Attribute name="group" value="samplegroup"/>
               <Attribute name="whatever" value="uuu"/>
            </Attributes>
         </OperationData>
      </OperationInfo>
   </Body>
</Envelope>
于 2013-01-30T01:18:13.430 に答える