2016-01-20 97 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>