transformar c# .net xml xslt xslcompiledtransform

c# - transformar xml a xslt



Pasar parámetros a XSLT Stylesheet a través de.NET (2)

probablemente necesite definir el parámetro en la parte superior del XSLT:

<xsl:param name="Boss_ID" /> <OrgDoc> //rest of the XSLT </OrgDoc>

Ver este enlace

http://projects.ischool.washington.edu/tabrooks/545/2004Autumn/ContentManagement/PassingParameters.htm

No es un gran ejemplo, pero es lo mejor que pude encontrar con Google rápido.

Estoy intentando pasar un parámetro a una hoja de estilo XSLT, pero todo lo que obtengo es un documento xml vacío cuando el documento se transforma utilizando XSlCompiledTransform.

Este es el método de C # utilizado para agregar los parámetros (después de agregar las sugerencias de las personas)

private static void CreateHierarchy(string manID) { string man_ID = manID; XsltArgumentList argsList = new XsltArgumentList(); argsList.AddParam("Boss_ID","",man_ID); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load("htransform.xslt"); using (StreamWriter sw = new StreamWriter("output.xml")) { transform.Transform("LU AIB.xml", argsList, sw); } }

y aquí está la hoja de estilos. El parámetro que paso es ''Boss_ID''

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:template match="OrgDoc"> <xsl:param name="Boss_ID"></xsl:param> <xsl:processing-instruction name="xml-stylesheet"> <xsl:text>type="text/xsl" href="../styles/orgcharts.xsl" </xsl:text> </xsl:processing-instruction> <OrgDoc> <xsl:for-each select="PosDets[@OC_Man = $Boss_ID]"> <PosDets OC_Pos="{@OC_Pos}" OC_Sub="{@OC_Sub}" OC_Man="{@OC_Man}" OC_Ttl="{@OC_Ttl}" OC_Rnk="{@OC_Rnk}" OC_Bdg="{@OC_Bdg}" OC_Fnd="{@OC_Fnd}" OC_OL3="{@OC_OL3}" OC_Tmp="{@OC_Tmp}"> <xsl:apply-templates select="../PosDets"> <xsl:with-param name="mgrid" select="@OC_Pos"/> </xsl:apply-templates> </PosDets> </xsl:for-each> </OrgDoc> </xsl:template> <xsl:template match="PosDets" > <xsl:param name="mgrid" /> <xsl:if test="@OC_Man=$mgrid" > <PosDets OC_Pos="{@OC_Pos}" OC_Sub="{@OC_Sub}" OC_Man="{@OC_Man}" OC_Ttl="{@OC_Ttl}" OC_Rnk="{@OC_Rnk}" OC_Bdg="{@OC_Bdg}" OC_Fnd="{@OC_Fnd}" OC_OL3="{@OC_OL3}" OC_Tmp="{@OC_Tmp}"> <xsl:apply-templates select="../PosDets"> <xsl:with-param name="mgrid" select="@OC_Pos"/> </xsl:apply-templates> </PosDets> </xsl:if> </xsl:template> </xsl:stylesheet>

No puedo publicar todo el documento de entrada ya que es información confidencial, pero aquí hay una breve versión desinfectada

<OrgDoc><PosDets OC_Pos="161" OC_Man="9" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /><PosDets OC_Pos="190" OC_Man="161" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /><PosDets OC_Pos="199" OC_Man="190" OC_Ttl="Boss" OC_Rank="" OC_OL3="LU AIB" OC_Bdg="Has Budget" OC_Fnd="Payroll" OC_Sub="" OC_Tmp="" /></OrgDoc>

¿Alguien puede ayudar?

Gracias


XsltArgumentList definir el parámetro dentro de su XSLT y también debe pasar el XsltArgumentList como argumento a la llamada Transform :

private static void CreateHierarchy(string manID) { string man_ID = manID; XsltArgumentList argsList = new XsltArgumentList(); argsList.AddParam("Boss_ID", "", man_ID); XslCompiledTransform transform = new XslCompiledTransform(true); transform.Load("htransform.xslt"); using (StreamWriter sw = new StreamWriter("output.xml")) { transform.Transform("LU AIB.xml", argsList, sw); } }

Tenga en cuenta que xsl:param debe definirse debajo del elemento xsl:stylesheet :

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:param name="Boss_ID"></xsl:param> <xsl:template match="OrgDoc"> <!-- template body goes here --> </xsl:template> </xsl:stylesheet>

Este ejemplo simple de XSLT creará solo un pequeño documento de salida que contendrá un nodo XML con su contenido configurado en el valor de su parámetro. Pruebalo:

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes" /> <xsl:param name="Boss_ID"></xsl:param> <xsl:template match="/"> <out> <xsl:value-of select="$Boss_ID" /> </out> </xsl:template> </xsl:stylesheet>