xsl-list
[Top] [All Lists]

Re: Attribute Value Template

2003-04-05 17:04:08
As an update for posterity, it works.

So, to recap, i have XML that looks like:

  <body>Subscriber agrees to pay Company the sum of $<sub
  name="install"/>, plus tax, if applicable, for the
  installation (and sale if the System is sold) of the
  System as follows: $<sub name="down_pmt"/> upon signing
  this Agreement; $<sub name="pre_wire_pmt"/> upon
  pre-wiring, if necessary; $<sub name="final_pmt"/>
  upon substantial completion of installation.</body>

And I proces that with XSLT as such:

        <xsl:template match="body">
                <fragment font="Helvetica" fontsize="7">
                        <xsl:apply-templates />
                </fragment>               
        </xsl:template>
        <xsl:template match="sub">
                <xsl:variable name="name" select="./@name"/>
                <xsl:value-of select="$subvalues/*[(_at_)name = $name]"/>
        </xsl:template>

And finally, I pass a nodeset from C# as follows:

XmlDocument paramDoc = new XmlDocument();
paramDoc.LoadXml("<subvalues><subvalue name='install_pmt'>1,000,000</subvalue><subvalue name='pre_wire_pmt'>20,000</subvalue></subvalues>");

XPathNavigator navigator = paramDoc.DocumentElement.CreateNavigator();

XsltArgumentList argList = new XsltArgumentList();
argList.AddParam("subvalues", "", navigator.Select("/*"));


And it works like a charm. The key is passing an XPathNodeIterator to the xsl:param (the Select() method returns the XPathNodeIterator). If anyone wants further details, let me know, and I'll put together a sample app. :)

P.S. Thanks everyone.

Michael Kay wrote:
Passing parameters depends on the platform you are using. The mention of
C# gives the clue that you're on the Microsoft platform. You can create
a DOM and pass the document object as a parameter to the stylesheet,
accessing the contents of the DOM using path expressions.

Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com


Based on the responses, I'm changing the model. This leads to my next question. Can I pass node-set (XmlElement) into an XslTransform by way of an XslArgument in C#? Than I can use Simon Woodside's suggestion. I will then pick off the value from the nodeset based on the value coming from the XML.

Thanks. :)

Michael Kay wrote:

and then pulling a value from an xsl:variable with the same name as
the data that came from the XML.

Any ideas? :)


how would you do it in C?

Variable names exist only at compile time, you can't

manipulate them
as strings at run time.

Change your data structure. Instead of having three

variables called
$x, $y, and $z, have a single variable $a whose value is a tree containing elements x, y, and z. Then you can use path expressions (and, if necessary, the xx:node-set() extension) to access the components of the value dynamically.

Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com


XSL-List info and archive:

http://www.mulberrytech.com/xsl/xsl-list


--
David B. Bitton
david(_at_)codenoevil(_dot_)com
www.codenoevil.com

Code Made Fresh DailyT


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



--
David B. Bitton
david(_at_)codenoevil(_dot_)com
www.codenoevil.com

Code Made Fresh Daily™


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>