xsl转换为相同的无界属性

时间:2014-09-10 10:43:48

标签: xml web-services xslt wsdl

我必须从源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>

1 个答案:

答案 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>