These are our Top 10 reads of July 2015.
thanks to all visitors, bookmark us, share us, talk about us, Follow us!, Like us! let’s grow bigger! You can even participate in our Github Projects!
These are our Top 10 reads of July 2015.
thanks to all visitors, bookmark us, share us, talk about us, Follow us!, Like us! let’s grow bigger! You can even participate in our Github Projects!
This snippet will help you to xsl transform xml files with custom namespaces. A Basic snippet which does only work without custom namespaces can be found HERE. The snippet will return a path to a temporary file (transformed xml).
private static string TransformXDocument(string inputXml, string xslFile) { try { var xslt = new XslCompiledTransform(); xslt.Load(xslFile); string tempFile = string.Empty; using (var sr = new StreamReader(inputXml, Encoding.Default)) { var xDoc = XDocument.Load(xslFile); if (xDoc.Root != null) { var result = xDoc.Root.Attributes().Where(a => a.IsNamespaceDeclaration).GroupBy(a => a.Name.Namespace == XNamespace.None ? String.Empty : a.Name.LocalName, a => XNamespace.Get(a.Value)).ToDictionary(g => g.Key,g => g.First()); var nt = new NameTable(); var mgr = new XmlNamespaceManager(nt); foreach (var ns in result.Where(ns => ns.Key != "xsl" && ns.Value != "http://www.w3.org/1999/XSL/Transform")) { mgr.AddNamespace(ns.Key, ns.Value.ToString()); } var xpc = new XmlParserContext(nt, mgr, "", XmlSpace.Default); var rds = new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Document}; using (var rd = XmlReader.Create(sr, rds, xpc)) { tempFile = Path.GetTempFileName(); using (var wr = new StreamWriter(tempFile)) { xslt.Transform(rd, new XsltArgumentList(), wr); wr.Flush(); wr.Close(); } rd.Close(); } } } return tempFile; } catch (Exception ex) { //handle the exception your way return string.Empty; } }
Private Shared Function TransformXDocument(inputXml As String, xslFile As String) As String Try Dim xslt = New XslCompiledTransform() xslt.Load(xslFile) Dim tempFile As String = String.Empty Using sr = New StreamReader(inputXml, Encoding.Default) Dim xDoc = XDocument.Load(xslFile) If xDoc.Root IsNot Nothing Then Dim result = xDoc.Root.Attributes().Where(Function(a) a.IsNamespaceDeclaration).GroupBy(Function(a) If(a.Name.[Namespace] = XNamespace.None, [String].Empty, a.Name.LocalName), Function(a) XNamespace.[Get](a.Value)).ToDictionary(Function(g) g.Key, Function(g) g.First()) Dim nt = New NameTable() Dim mgr = New XmlNamespaceManager(nt) For Each ns As var In result.Where(Function(ns) ns.Key <> "xsl" AndAlso ns.Value <> "http://www.w3.org/1999/XSL/Transform") mgr.AddNamespace(ns.Key, ns.Value.ToString()) Next Dim xpc = New XmlParserContext(nt, mgr, "", XmlSpace.[Default]) Dim rds = New XmlReaderSettings() With { _ Key .ConformanceLevel = ConformanceLevel.Document _ } Using rd = XmlReader.Create(sr, rds, xpc) tempFile = Path.GetTempFileName() Using wr = New StreamWriter(tempFile) xslt.Transform(rd, New XsltArgumentList(), wr) wr.Flush() wr.Close() End Using rd.Close() End Using End If End Using Return tempFile Catch ex As Exception 'handle the exception your way Return String.Empty End Try End Function
To use a counter in a XSL For-Each block, you can use the position() function, the Counter starts at value 1.
<xsl:for-each select="Order/Products/Product"> <position><xsl:value-of select="position()"></xsl:value-of></position> </xsl:for-each>
see also MSDN position Function
To use the simply type percent (xs:decimal), see the snippet below.
<xs:simpleType name="percent"> <xs:annotation> <xs:documentation>The percent type specifies a value from 0 to 100.</xs:documentation> </xs:annotation> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0"/> <xs:maxInclusive value="100"/> </xs:restriction> </xs:simpleType>
To validate xml file with xsd file in C# and VB.NET you can use the following snippet.
public string ValidateXDocument(XDocument xmlFile, string xsdFile) { try { var retVal = String.Empty; var schemas = new XmlSchemaSet(); schemas.Add(null, xsdFile); xmlFile.Validate(schemas, (o, e) => { retVal = e.Message; }); return retVal; } catch (Exception ex) { //handle the exception your way return ex.ToString(); } }
Public Function ValidateXDocument(xmlFile As XDocument, xsdFile As String) As String Try Dim retVal = [String].Empty Dim schemas = New XmlSchemaSet() schemas.Add(Nothing, xsdFile) xmlFile.Validate(schemas, Function(o, e) retVal = e.Message End Function) Return retVal Catch ex As Exception 'handle the exception your way Return ex.ToString() End Try End Function