我有一个结构如下的xml。将有多种不同类型的资产(PhoneNumbers和IP addrsses)。
<Assets>
<Asset>
<Name>PhoneNumber</Name>
<Params>
<Param>
<Name>number</Name>
<Value>+54123232</Value>
</Param>
</Params>
</Asset>
<Asset>
<Name>IPAddress</Name>
<Params>
<Param>
<Name>IPv4</Name>
<Value>1.1.1.1</Value>
</Param>
<Param>
<Name>IPv6</Name>
<Value>2.2.2.2</Value>
</Param>
</Params>
</Asset>
<Asset>
<Name>PhoneNumber</Name>
<Params>
<Param>
<Name>number</Name>
<Value>+123456789</Value>
</Param>
</Params>
</Asset>
</Assets>
我想写一个xslt将其转换为下面的结构。所有PhoneNumber将合并为一个资产,其中包含所有电话号码。
<Assets>
<Asset>
<Name>PhoneNumberBlock</Name>
<PhoneNumbers>
<PhoneNumber>+54123232</PhoneNumber>
<PhoneNumber>+123456789</PhoneNumber>
</PhoneNumbers>
<Asset>
<Asset>
<Name>IPBlock</Name>
<IPv4Address>1.1.1.1</IPv4Address>
<IPv6Address>2.2.2.2</IPv6Address>
<Asset>
</Assets>
我只知道基本的xslt foreach / switch / choose / if和all。不熟悉如何使用模板。可以请任何人帮助并指出我正确的方向。
答案 0 :(得分:2)
似乎没有按Asset/Name
进行分组的一般规则。
因此,您可以尝试这个直接的前言解决方案:
<xsl:template match="Assets" >
<Assets>
<Asset>
<Name>PhoneNumberBlock</Name>
<PhoneNumbers>
<xsl:apply-templates select="Asset[Name='PhoneNumber']/Params/*" />
</PhoneNumbers>
</Asset>
<Asset>
<Name>IPBlock</Name>
<xsl:apply-templates select="Asset[Name='IPAddress']/Params/*" />
</Asset>
</Assets>
</xsl:template>
<xsl:template match="Param[Name='number']" >
<PhoneNumber><xsl:value-of select="Value"/></PhoneNumber>
</xsl:template>
<xsl:template match="Param[Name='IPv4']" >
<IPv4Address><xsl:value-of select="Value"/></IPv4Address>
</xsl:template>
<xsl:template match="Param[Name='IPv6']" >
<IPv6Address><xsl:value-of select="Value"/></IPv6Address>
</xsl:template>