您好我是xslt样式表的新手。我已经浏览了将XML转换为CSV文件的所有帖子。但我真正需要的是下面的内容。
我的XML数据。
<EmployeeDetails>
<EmployeeName>ABC</EmployeeName>
<EmployeeID>123</EmployeeID>
<EmployeeName>DEF</EmployeeName>
<EmployeeID>456</EmployeeID>
<EmployeeName>GHI</EmployeeName>
<EmployeeID>789</EmployeeID>
</EmployeeDetails>
我需要输出
<Result>ABC,DEF,GHI</Result>
感谢任何帮助。
由于
答案 0 :(得分:1)
不确定你有哪些工具可用,但我写了一个简单的函数来完成你在c#中提出的要求。
private void ProcessXML2(Object stateInfo)
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
XmlReader reader = XmlReader.Create(AppDomain.CurrentDomain.BaseDirectory + "data.xml", settings);
StringBuilder sb = new StringBuilder();
sb.Append("<Result>");
string xmlEmployeeName = String.Empty;
reader.MoveToContent();
while (reader.Read())
{
if(reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "EmployeeName")
{
while ((reader.NodeType != XmlNodeType.Text))
{
reader.Read();
}
if (reader.NodeType == XmlNodeType.Text)
if (reader.Value != null)
{
sb.Append(reader.Value + ",");
}
}
}
}
sb.Append("</Result>");
using (StreamWriter sw = File.CreateText(AppDomain.CurrentDomain.BaseDirectory + "output.csv"))
{
sw.Write(sb);
sb.Clear();
sw.Close();
}
}
如果您能够使用C#,则可以调整此方法以使其更干净。我已经用你帖子中的输入和输出对此进行了测试。
答案 1 :(得分:1)
我不会称之为csv,但以下样式表可以完成这项工作:
<?xml version="1.0" encoding="ASCII"?>
<xsl:stylesheet
version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method='xml' />
<xsl:template match="/">
<xsl:apply-templates select="EmployeeDetails"/>
</xsl:template>
<xsl:template match="EmployeeDetails">
<Result><xsl:for-each select="EmployeeName">
<xsl:if test="position()>1">,</xsl:if>
<xsl:value-of select="text()"/>
</xsl:for-each></Result>
</xsl:template>
</xsl:stylesheet>
$ xsltproc a.xsl b.xml
<?xml version="1.0"?>
<Result>ABC,DEF,GHI</Result>
答案 2 :(得分:1)
下面有点清洁的XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" indent="no" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="EmployeeDetails">
<Result>
<xsl:apply-templates/>
</Result>
</xsl:template>
<xsl:template match="EmployeeName">
<xsl:apply-templates/>
<xsl:if test="following-sibling::EmployeeName">
<xsl:text>,</xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="EmployeeID"/>
</xsl:stylesheet>