实现这个xslt翻译

时间:2013-01-30 00:03:03

标签: xml xslt xslt-1.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是识别的标签。我想把它放在属性列表中的其他任何东西,如上所述。 “其他”标签列表可能会增长 - 因此我们的想法是将所有其他标签放入此属性包中。

我遇到的挑战是我无法为每个人做或者识别“其他”标签。我尝试选择不(自我::使用或声明,但没有多大帮助。

1 个答案:

答案 0 :(得分:1)

在XSLT 1.0中,您可以使用xsl: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>