我有一个要求,我必须使用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是识别的标签。我想把它放在属性列表中的其他任何东西,如上所述。 “其他”标签列表可能会增长 - 因此我们的想法是将所有其他标签放入此属性包中。
我遇到的挑战是我无法为每个人做或者识别“其他”标签。我尝试选择不(自我::使用或声明,但没有多大帮助。
答案 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>