2016-01-20 101 views
1

我无法正确获取XML格式。我从MySQL数据库中提取数据,并返回数据。在XML中添加元素。 (XSLT)

<Customers> 
<Customer Telephone="#" Country="#" Postcode="#" County="" Town="#" Address2="#" Address1="#" Surname="#" Forename="#" Suffix="#" Middlename="#" Title="#" Id="#"/> 
</Customers> 

我需要这些属性元素与快速搜索是相当容易的,使用XLST下面的文件。

<?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"/> 
<xsl:template match="/"> 
<Company> 
<xsl:apply-templates/> 
</Company> 
</xsl:template> 
<xsl:template match="@* | node()"> 
<xsl:copy> 
<xsl:apply-templates select="@* | node()"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="@*"> 
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element> 
</xsl:template> 
<xsl:template match="@*"> 
<xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

我最终得到的数据是这样的。

<Company> 
<Customers> 
<Customer><Id>#</Id><Title>#</Title><Middlename>#</Middlename><Suffix>#</Suffix><Forename>#</Forename><Surname>#</Surname><Address1>#</Address1><Address2>#</Address2><Town>#</Town><County>#</County><Postcode>#</Postcode><Country>#</Country><Telephone>#</Telephone> 
</Customer> 
</Customers> 
</Company> 

不过,我需要添加一个使用XSLT,但真的挣扎如何做到这一点“<地址> < /地址>”元左右(地址1和地址2)。几乎所有我尝试过的结果都会导致错误。

在先进的感谢,

回答

4

您在XSLT样式表具有相同的模板两次它是否发生吗?

在处理Customer元素的位置插入标识模板。插入一个新的元素Adresses和里面,应用模板只属性,其名称中包含“住址”:

<Adresses> 
    <xsl:apply-templates select="@*[contains(name(),'Address')]"/> 
</Adresses> 

只有然后应用模板的Customer剩余内容:

<xsl:apply-templates select="@*[not(contains(name(),'Address'))]|node()"/> 

XSLT样式表

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <Company> 
      <xsl:apply-templates/> 
     </Company> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Customer"> 
     <xsl:copy> 
      <Adresses> 
       <xsl:apply-templates select="@*[contains(name(),'Address')]"/> 
      </Adresses> 
      <xsl:apply-templates select="@*[not(contains(name(),'Address'))]|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Customer/@*"> 
     <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

XML输出

<?xml version="1.0" encoding="UTF-8"?> 
<Company> 
    <Customers> 
     <Customer> 
     <Adresses> 
      <Address2>#</Address2> 
      <Address1>#</Address1> 
     </Adresses> 
     <Telephone>#</Telephone> 
     <Country>#</Country> 
     <Postcode>#</Postcode> 
     <County/> 
     <Town>#</Town> 
     <Surname>#</Surname> 
     <Forename>#</Forename> 
     <Suffix>#</Suffix> 
     <Middlename>#</Middlename> 
     <Title>#</Title> 
     <Id>#</Id> 
     </Customer> 
    </Customers> 
</Company> 

请注意,属性顺序在XML中并不重要。 XML解析器以任意顺序提供元素的属性。在你的情况下,这意味着在输出中的子元素Customer的顺序将是任意的。


在线试用此解决方案here

+0

非常感谢,这个伟大的工程。另外http://xsltransform.net/是一个很好的工具! – Simbady

1

使用

<xsl:template match="Customer/@Address1"> 
    <Addresses> 
    <Address1> 
     <xsl:value-of select="."/> 
    </Address1> 
    <Address2> 
     <xsl:value-of select="../@Address2"/> 
    </Address2> 
    </Addresses> 
</xsl:template> 

<xsl:template match="Customer/@Address2"/> 
0

首先,您现有的样式表具有冲突的模板:您有不少于3个匹配@*的模板。

我会建议你得到更具体一点(和短得多):

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/Customers"> 
    <Company> 
     <xsl:apply-templates/> 
    </Company> 
</xsl:template> 

<xsl:template match="Customer"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*[not(starts-with(name(), 'Address'))]"/> 
     <Addresses> 
      <xsl:apply-templates select="@*[starts-with(name(), 'Address')]"/> 
     </Addresses> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet>