我正在尝试转换以下XML
我有一个转换,需要添加一个额外的部分。
这是XML文件的当前格式。
<?xml version="1.0" encoding="utf-8" ?>
<contacts>
<contact>
<attribute>
<name>text12</name>
<value>B00085590</value>
</attribute>
<attribute>
<name>text34</name>
<value>Atomos</value>
</attribute>
<attribute>
<name>date866</name>
<value>02/21/1991</value>
</attribute>
<attribute>
<name>text123</name>
<value>brady@gmail.com</value>
</attribute>
<attribute>
<name>text875</name>
<value>123-456-7890</value>
</attribute>
</contact>
<contact>
<attribute>
<name>text12</name>
<value>B00058478</value>
</attribute>
<attribute>
<name>text34</name>
<value>Balderas</value>
</attribute>
<attribute>
<name>date866</name>
<value>11/24/1997</value>
</attribute>
<attribute>
<name>text123</name>
<value>balderas@yahoo.com</value>
</attribute>
<attribute>
<name>text875</name>
<value>098-765-4321</value>
</attribute>
</contact>
</contacts>
这是我目前的转变
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<!--Identify location of the lookup xml-->
<xsl:param name="lookupDoc" select="document('C:\Projects\FormattedAttributes.xml')" />
<!--Lookup Key-->
<xsl:key name="att-lookup" match="attributes/attribute" use="name"/>
<!--Main Template-->
<xsl:template match="/contacts">
<contacts>
<!--Apply Formatted Contacts Template-->
<xsl:apply-templates select="contact" />
</contacts>
</xsl:template>
<!--Formatted Contacts Template-->
<xsl:template match="contact">
<contact>
<xsl:for-each select="attribute">
<!--Create variable to hold New Name after passing the Data Name to the Lookup Key-->
<xsl:variable name="name" select="name"/>
<xsl:variable name="newName">
<xsl:for-each select="$lookupDoc">
<xsl:apply-templates select="key('att-lookup', $name)/mappingname"/>
</xsl:for-each>
</xsl:variable>
<!--Format Contact Element with New Name variable-->
<xsl:element name="{$newName}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
</contact>
</xsl:template>
</xsl:stylesheet>
这是转换中使用的查找XML的示例
<?xml version="1.0" encoding="utf-8" ?>
<attributes>
<attribute folder="PERSONAL">
<name>text12</name>
<mappingname>ID</mappingname>
<datatype>Varchar2</datatype>
<size>30</size>
</attribute>
<attribute folder="PERSONAL">
<name>text34</name>
<mappingname>LAST_NAME</mappingname>
<datatype>Varchar2</datatype>
<size>30</size>
</attribute>
<attribute folder="PERSONAL">
<name>date866</name>
<mappingname>DOB</mappingname>
<datatype>Date</datatype>
<size></size>
</attribute>
<attribute folder="CONTACT_INFO">
<name>text123</name>
<mappingname>EMAIL</mappingname>
<datatype>Varchar2</datatype>
<size>30</size>
</attribute>
<attribute folder="CONTACT_INFO">
<name>text875</name>
<mappingname>PHONE</mappingname>
<datatype>Varchar2</datatype>
<size>20</size>
</attribute>
</attributes>
目前,我的转换提供了以下输出,如超级按钮
<?xml version="1.0" encoding="utf-8" ?>
<contacts>
<contact>
<ID>B00085590</ID>
<LAST_NAME>Brady</LAST_NAME>
<DOB>02/21/1991</DOB>
<EMAIL>brady@gmail.com</EMAIL>
<PHONE>123-456-7890</PHONE>
</contact>
<contact>
<ID>B00058478</ID>
<LAST_NAME>Balderas</LAST_NAME>
<DOB>11/24/1997</DOB>
<EMAIL>balderas@yahoo.com</EMAIL>
<PHONE>098-765-4321</PHONE>
</contact>
</contacts>
我的要求已更改,我需要更改最终转换以考虑文件夹属性,并将ID元素视为所有新创建的文件夹父属性的属性。 如何在新创建的文件夹父文件夹下按属性对所有元素进行分组?
<?xml version="1.0" encoding="utf-8" ?>
<data>
<PERSONAL ID="B00085590">
<LAST_NAME>Brady</LAST_NAME>
<DOB>02/21/1991</DOB>
</PERSONAL>
<PERSONAL ID="B00058478">
<LAST_NAME>Balderas</LAST_NAME>
<DOB>11/24/1997</DOB>
</PERSONAL>
<CONTACT_INFO ID="B00085590">
<EMAIL>brady@gmail.com</EMAIL>
<PHONE>123-456-7890</PHONE>
</CONTACT_INFO>
<CONTACT_INFO ID="B00058478">
<EMAIL>balderas@yahoo.com</EMAIL>
<PHONE>098-765-4321</PHONE>
</CONTACT_INFO>
</data>
答案 0 :(得分:2)
尝试使用此模板,该模板涉及Muenchian分组技术以获取不同的文件夹。然后,每个不同文件夹的属性都存储在一个变量中,该变量用于输出联系人详细信息的相关属性。
<xsl:template match="contact">
<xsl:variable name="contact" select="." />
<xsl:for-each select="$lookupDoc">
<xsl:variable name="idKey" select="attributes/attribute[mappingname='ID']/name" />
<xsl:for-each select="attributes/attribute[generate-id() = generate-id(key('folder-lookup', @folder)[1])]">
<xsl:element name="{@folder}">
<xsl:attribute name="ID">
<xsl:value-of select="$contact/attribute[name=$idKey]/value" />
</xsl:attribute>
<xsl:variable name="attributes" select="key('folder-lookup', @folder)" />
<xsl:for-each select="$contact/attribute[name = $attributes/name][name != $idKey]">
<xsl:variable name="newName" select="$attributes[name=current()/name]/mappingname" />
<xsl:element name="{$newName}">
<xsl:value-of select="value"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:template>