我必须从源wsdl转换为目标wsdl。 在我的源wsdl中,我有4个属性。以下给出了从源wsdl返回的结果:
<Role>
<roleName>Role1</roleName>
<StartDate>2014-08-26</StartDate>
<primary>true</primary>
</Role>
这将映射到可以有多个事件(无界)的属性。
该属性的格式为:
<xs:complexType name="Attr">
<xs:sequence>
<xs:element name="attributeName" type="xs:string" minOccurs="0"/>
<xs:element name="Attributes" type="tns:dataValue"
nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="dataValue">
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element name="value" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
这里我想将属性的名称映射到dataValue中的名称,将属性的值映射到DataValue的值。 例如,如果roleName是role1,则name是roleName,value是role1。同样,我也想映射其他2个属性。
我期待以下格式的输出:
<Attr>
<attributeName>Role</attributeName>
<Attributes>
<name>RoleName</name>
<value>Role1</value>
</Attributes>
<Attributes>
<name>StartDate</name>
<value>2014-08-26</value>
</Attributes>
<Attributes>
<name>primary</name>
<value>true</value>
</Attributes>
</Attr>
答案 0 :(得分:0)
假设这确实是您的XML,那么您只需要一个与Role
元素相匹配的模板....
<xsl:template match="Role">
然后,您将使用local-name()
函数输出名称....
<attributeName>
<xsl:value-of select="local-name()"/>
</attributeName>
要获取“属性”(在原始XML中是元素,而不是属性),您可以使用xsl:for-each
迭代它们,例如:
<xsl:for-each select="*">
然后您将再次使用local-name()
函数来获取元素名称。试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Role">
<Attr>
<attributeName>
<xsl:value-of select="local-name()"/>
</attributeName>
<xsl:for-each select="*">
<Attributes>
<name>
<xsl:value-of select="local-name()"/>
</name>
<value>
<xsl:value-of select="."/>
</value>
</Attributes>
</xsl:for-each>
</Attr>
</xsl:template>
</xsl:stylesheet>
当这应用于您的问题中显示的以下XML ....
<Role>
<roleName>Role1</roleName>
<StartDate>2014-08-26</StartDate>
<primary>true</primary>
</Role>
然后输出以下内容
<Attr>
<attributeName>Role</attributeName>
<Attributes>
<name>roleName</name>
<value>Role1</value>
</Attributes>
<Attributes>
<name>StartDate</name>
<value>2014-08-26</value>
</Attributes>
<Attributes>
<name>primary</name>
<value>true</value>
</Attributes>
</Attr>