问题
I am trying to parse an xml file with xslt.
I need to have the values grouped in a div tag.
First row the div tag should have a special class <div class="firstrow">
All other rows should have <div class="tabpanel">.
How can I assign the class="firstrow" for first row and all other rows with class="tabpanel"?
source xml
<row>
<column1>ABC</<column1>
<column2>ABC</<column2>
</row>
<row>
<column1>123</<column1>
<column2>123</<column2>
</row>
<row>
<column1>234</<column1>
<column2>234</<column2>
</row>
Output I want
<div class="firstrow">
ABC
ABC
</div>
<div class="tabpanel">
123
123
</div>
<div class="tabpanel">
234
234
</div>
Thanks
回答1:
As simple as this:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="row[1]">
<div class="firstrow"><xsl:value-of select="."/></div>
</xsl:template>
<xsl:template match="row">
<div class="tabpanel"><xsl:value-of select="."/></div>
</xsl:template>
</xsl:stylesheet>
When this transformation is applied on this XML document (the provided one, made well-formed!):
<t>
<row>
<column1>ABC</column1>
<column2>ABC</column2>
</row>
<row>
<column1>123</column1>
<column2>123</column2>
</row>
<row>
<column1>234</column1>
<column2>234</column2>
</row>
</t>
the wanted, correct result is produced:
<div class="firstrow">
ABC
ABC
</div>
<div class="tabpanel">
123
123
</div>
<div class="tabpanel">
234
234
</div>
回答2:
Firt of all , there should be a root element in your source xml, so I changed it as follows:
Source Xml
<rows>
<row>
<column1>
ABC
</column1>
<column2>
ABC
</column2>
</row>
<row>
<column1>
123
</column1>
<column2>
123
</column2>
</row>
<row>
<column1>
234
</column1>
<column2>
234
</column2>
</row>
</rows>
Required Xslt
<?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="html" indent="yes"/>
<xsl:template match="rows">
<xsl:for-each select="row">
<xsl:if test="position() = 1">
<div class="firstrow">
<xsl:call-template name="PrintColumnValues"></xsl:call-template>
</div>
</xsl:if>
<div class="tabpanel">
<xsl:call-template name="PrintColumnValues"></xsl:call-template>
</div>
</xsl:for-each>
</xsl:template>
<xsl:template name="PrintColumnValues">
<xsl:value-of select="column1"/>
<xsl:value-of select="column2"/>
</xsl:template>
</xsl:stylesheet>
After transforming source xml using this xslt you will get desired html output.
NOTE: As a help here I am adding some code that can be used for xslt transformation.
public static string TransformContentXmlwithXslt(XmlDocument xmlDocument, string xsltFileName)
{
//Load the XML data document
MemoryStream contentStream = new MemoryStream();
xmlDocument.Save(contentStream);
contentStream.Position = 0;
XPathDocument mergedXPathDocument = new XPathDocument(contentStream);
XsltSettings xsltJsSetting = new XsltSettings();
xsltJsSetting.EnableScript = true;
//Load the XSLT file
string xsltFilePath = xsltFileName;
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsltFilePath, xsltJsSetting, new XmlUrlResolver());
//Do the transformation
MemoryStream transformedContentMemoryStream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(transformedContentMemoryStream, Encoding.UTF8);
StreamReader streamReader = new StreamReader(transformedContentMemoryStream);
xslt.Transform(mergedXPathDocument, writer);
transformedContentMemoryStream.Position = 0;
string transformedHtml = streamReader.ReadToEnd();
//// Close the connections
streamReader.Close();
transformedContentMemoryStream.Close();
return transformedHtml;
}
Here, xsltFileName should contain full file path.
You can get the transformed output by calling this method.
来源:https://stackoverflow.com/questions/12840585/xslt-special-condition-for-first-row