2015-09-20 147 views
0

是否可以使用XSLT填充數據。我已經搜索並找不到任何有用的東西。使用XSLT「填充」數據

爲了說明,我收到了一些這樣的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Record> 
     <CompanyName>A</CompanyName> 
     <ContactSurname>A</ContactSurname> 
     <ContactFirstname>E</ContactFirstname> 
     <Address>Address 1</Address> 
    </Record> 
    <Record> 
     <Address>Address 2</Address> 
    </Record> 
    <Record> 
     <Address>Address 3</Address> 
    </Record> 

    <Record> 
     <CompanyName>B</CompanyName> 
     <ContactSurname>B</ContactSurname> 
     <ContactFirstname>A</ContactFirstname> 
     <Address>Address 4</Address> 
    </Record> 
    <Record> 
     <Address>Address 5</Address> 
    </Record> 
    .... 

我需要做的是改變不包含所有元素添加它們因此輸出將是每個記錄。

<?xml version="1.0" encoding="UTF-8"?> 
    <Root> 
    <Record> 
     <CompanyName>A</CompanyName> 
     <ContactSurname>A</ContactSurname> 
     <ContactFirstname>E</ContactFirstname> 
     <Address>Address 1</Address> 
    </Record> 
    <Record> 
     <CompanyName>A</CompanyName> 
     <ContactSurname>A</ContactSurname> 
     <ContactFirstname>E</ContactFirstname> 
     <Address>Address 2</Address> 
    </Record> 
    <Record> 
     <CompanyName>A</CompanyName> 
     <ContactSurname>A</ContactSurname> 
     <ContactFirstname>E</ContactFirstname> 
     <Address>Address 3</Address> 
    </Record> 

    <Record> 
     <CompanyName>B</CompanyName> 
     <ContactSurname>B</ContactSurname> 
     <ContactFirstname>A</ContactFirstname> 
     <Address>Address 4</Address> 
    </Record> 
    <Record> 
     <CompanyName>B</CompanyName> 
     <ContactSurname>B</ContactSurname> 
     <ContactFirstname>A</ContactFirstname> 
     <Address>Address 5</Address> 
    </Record> 
    .... 

我可以輕鬆地使用.NET通過記錄進行迭代,並創建一個新的XML文件,但我認爲它可能是更快,更簡單的做這樣如果有可能。

+0

http://stackoverflow.com/help/someone-answers –

回答

1

下面就來看看它的一種方法:

XSLT 1.0

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

<xsl:template match="/Root"> 
    <xsl:copy> 
     <xsl:for-each select="Record"> 
      <xsl:variable name="stack" select=". | preceding-sibling::Record" /> 
      <xsl:copy> 
       <xsl:copy-of select="($stack/CompanyName)[last()]"/> 
       <xsl:copy-of select="($stack/ContactSurname)[last()]"/> 
       <xsl:copy-of select="($stack/ContactFirstname)[last()]"/> 
       <xsl:copy-of select="($stack/Address)[last()]"/> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

考慮通過以下邁克爾·凱的評論,你可能會發現這個快:

<xsl:template match="/Root"> 
    <xsl:copy> 
     <xsl:for-each select="Record"> 
      <xsl:copy> 
       <xsl:copy-of select="((. | preceding-sibling::Record[CompanyName][1])/CompanyName)[last()]" /> 
       <xsl:copy-of select="((. | preceding-sibling::Record[ContactSurname][1])/ContactSurname)[last()]" /> 
       <xsl:copy-of select="((. | preceding-sibling::Record[ContactFirstname][1])/ContactFirstname)[last()]" /> 
       <xsl:copy-of select="((. | preceding-sibling::Record[Address][1])/Address)[last()]" /> 
      </xsl:copy> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 
+0

這很可能hav e O(n^2)表現;如果速度太慢,另一種可能是用(例如)替換xsl:copy- –

+0

@MichaelKay這不會產生相同的結果。 –