使用XSLT“填充”数据
问题描述:
是否可以使用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文件,但我认为它可能是更快,更简单的做这样如果有可能。
答
下面就来看看它的一种方法:
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)表现;如果速度太慢,另一种可能是用(例如)
+0
@MichaelKay这不会产生相同的结果。 –
http://stackoverflow.com/help/someone-answers –