2014-09-10 30 views
0

我必须执行从源wsdl到目标wsdl的转换。 以我源WSDL我有4 attributes.The下面给出从源WSDL返回的结果:将xsl转换为相同的无界属性

<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.Similarly我想映射其他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

,你能否告诉一个实际的例子您希望在这种情况下输出的XML?如果您已经尝试了一些XSLT,发布这也会有所帮助。非常感谢你。 – 2014-09-10 12:14:42

+0

这与您的其他问题有什么不同? http://stackoverflow.com/questions/25759154/how-to-map-multiple-attributes-from-source-to-a-multivalued-attribute-on-target – 2014-09-10 12:18:20

+1

此外,请阅读[**我如何问一个好问题?**](http://stackoverflow.com/help/how-to-ask),并回顾你是如何提出问题和[**接受**](http://meta.stackoverflow.com/ q/5234/234215)的答案。 * 6接受56个问题看起来不对劲* – kjhughes 2014-09-10 12:34:32

回答

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> 
+0

使用name()和node()代替local-name和。帮助我获得了所需的改造 – 2015-01-09 06:45:23