2009-10-05 14 views
26

Próbuję przekazać parametr do arkusza stylów XSLT, ale wszystko, co otrzymuję, to pusty dokument xml, gdy dokument jest transformowany przy użyciu XSlCompiledTransform.Przekazywanie parametrów do arkusza stylów XSLT za pośrednictwem .NET

Jest to metoda C# służy do dodawania parametrów (po dodaniu w sugestii ludzi)

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); 
     } 


    } 

i tutaj jest arkusz stylów. Parametr jestem przekazując jest „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> 

nie mogę pisać wszystko dokumentu wejściowego, jak to informacja poufna, ale tutaj jest krótka odkażane wersji

<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> 

może ktoś pomóc?

Dzięki

+0

Połączyć oba @MichaelEdwards i @divo, aby uzyskać poprawną odpowiedź. :) – David

+0

Niestety po zrobieniu tego nadal nie działa. Jest to wynikowy dokument XML MrBliz

+0

Jesteś pewien? Nie zgodnie z tym artykułem: - http://www.xml.com/pub/a/2000/09/13/xslt/index.html – MrBliz

Odpowiedz

49

Trzeba określić parametr w swoim XSLT i trzeba także przekazać XsltArgumentList jako argument do Transform rozmowy:

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); 
    } 
} 

Należy pamiętać, że xsl:param muszą być zdefiniowane poniżej elementu 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> 

Ten prosty przykład XSLT utworzy tylko mały dokument wyjściowy zawierający jeden Węzeł XML z jego zawartością ustawiony na wartość twojego parametru. Wypróbuj:

<?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> 
+0

Dzięki Divo Nadal nie działa choć Am I odnosząc się do paramter prawidłowo w XSL z tej linii MrBliz

+0

Zobacz moją aktualizację.Jeśli nadal nie działa, proszę zaksięgować swój dokument wejściowy.Może problem z tym .. –

+0

Dzięki Divo, że rzeczywiście wyprodukował pożądany parametr, ale nie mogę zrozumieć, dlaczego nie jest Pracuję nad moim dokumentem – MrBliz

5

prawdopodobnie trzeba zdefiniować param na górze XSLT:

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

widzisz tego linku

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

nie jest to wspaniały przykład, ale najlepsza, można znaleźć za pomocą szybkiego google.

+0

Z jakiegoś powodu przepełnienie stosu pominęło nazwę parametru. Zmieniono teraz pytanie. Dzięki za link. . Chociaż nadal nie działa; ( – MrBliz

Powiązane problemy