<feed xmlns='http://www.w3.org/2005/Atom'>
<title>InputXSLT/test, branch master</title>
<subtitle>XSLT extensions for static site generation</subtitle>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/'/>
<entry>
<title>Fix `read_directory` testcase</title>
<updated>2018-10-02T17:04:04+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2018-10-02T17:04:04+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=c6642afaa2d8af9bcde6a805666dfe3566ce4c6e'/>
<id>c6642afaa2d8af9bcde6a805666dfe3566ce4c6e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Replaced FunctionTransform by making the target of FunctionGenerate optional</title>
<updated>2014-08-22T22:19:09+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-08-22T22:19:09+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=5a54b5b8150d8bf1ac5db3ac688479b3aca6486d'/>
<id>5a54b5b8150d8bf1ac5db3ac688479b3aca6486d</id>
<content type='text'>
* if the target parameter is not provided FunctionGenerate now performs exactly the same functionality as FunctionTransform
* added "boost::optional&lt;boost::filesystem::path&gt;" specialization to the XObjectValue class
* modified test cases accordingly
* modified README.md accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* if the target parameter is not provided FunctionGenerate now performs exactly the same functionality as FunctionTransform
* added "boost::optional&lt;boost::filesystem::path&gt;" specialization to the XObjectValue class
* modified test cases accordingly
* modified README.md accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Renamed FunctionExternalCommand result root node</title>
<updated>2014-08-18T18:11:18+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-08-18T18:11:18+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=b31f9170c2bc2330442070968d3cb334cadb5faa'/>
<id>b31f9170c2bc2330442070968d3cb334cadb5faa</id>
<content type='text'>
* this change was implemented to match the naming scheme of all other external functions
* updated external text formatter test case accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* this change was implemented to match the naming scheme of all other external functions
* updated external text formatter test case accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented primitive optional parameter support for external functions</title>
<updated>2014-08-16T21:30:36+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-08-16T21:30:36+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=f6ff54c492df81018cf48da039ee681508f88e46'/>
<id>f6ff54c492df81018cf48da039ee681508f88e46</id>
<content type='text'>
* renamed FunctionExternalTextFormatter into FunctionExternalCommand
** the goal is to provide a general interface to a variety of external commands
*** e.g. not just text formatters but system utilities for file management and so on
** this requires the stdin parameter to be optional as not all external commands require stdin input
* implemented "filter_derived" helper template to determine amount of optional parameters
** optional parameters are defined as "boost::optional" specializations
*** they in turn can be detected by checking if "boost::optional_detail::optional_tag" is a base class
* "callConstructDocument" member method of "FunctionBase" performs additional bounds checking of parameter vector
* "boost::optional&lt;std::string&gt;" specific member overload was added to "XObjectValue" helper class
** we will have to provide full specializations for all optional types as C++ prohibits partial member function template specialization
* renamed the external function in "PlattformGuard"
* changed README.md and test cases accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* renamed FunctionExternalTextFormatter into FunctionExternalCommand
** the goal is to provide a general interface to a variety of external commands
*** e.g. not just text formatters but system utilities for file management and so on
** this requires the stdin parameter to be optional as not all external commands require stdin input
* implemented "filter_derived" helper template to determine amount of optional parameters
** optional parameters are defined as "boost::optional" specializations
*** they in turn can be detected by checking if "boost::optional_detail::optional_tag" is a base class
* "callConstructDocument" member method of "FunctionBase" performs additional bounds checking of parameter vector
* "boost::optional&lt;std::string&gt;" specific member overload was added to "XObjectValue" helper class
** we will have to provide full specializations for all optional types as C++ prohibits partial member function template specialization
* renamed the external function in "PlattformGuard"
* changed README.md and test cases accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Changed FunctionExternalTextFormatter to execute formatter inside shell</title>
<updated>2014-08-09T16:42:47+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-08-09T16:42:47+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=7f6611cded8c1591f1aa1a4c7d70505cb21e7967'/>
<id>7f6611cded8c1591f1aa1a4c7d70505cb21e7967</id>
<content type='text'>
* otherwise one has to pass the full path to the command
** additionally it is much easier to enable passing arguments to the external formatter this way
* modified external function parameter accordingly
* updated external text formatter test case
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* otherwise one has to pass the full path to the command
** additionally it is much easier to enable passing arguments to the external formatter this way
* modified external function parameter accordingly
* updated external text formatter test case
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented external "generate" function</title>
<updated>2014-07-12T14:15:42+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-07-12T14:15:42+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=086779c6d3d40f244b6aafd6d402fd29b921a735'/>
<id>086779c6d3d40f244b6aafd6d402fd29b921a735</id>
<content type='text'>
* this function essentially provides the same functionality as FunctionTransform with the addition of directly committing the result to the filesystem
** this is needed if one wants to generate doctype-containing transformations from inside a transformation as "write-file" is not able to infer the doctype of a given xalan::XalanNode pointer
** this is a integral limitation of (at least) XSLT 1.0 as implemented in Apache Xalan
*** a document can of course only have a single document type
*** e.g. we can not include a doctype node in the result tree of FunctionTransform
* implemented test case for FunctionGenerate
* transformation "test.xsl" is shared between the FunctionTransform and FunctionGenerate test cases
* modified README.md accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* this function essentially provides the same functionality as FunctionTransform with the addition of directly committing the result to the filesystem
** this is needed if one wants to generate doctype-containing transformations from inside a transformation as "write-file" is not able to infer the doctype of a given xalan::XalanNode pointer
** this is a integral limitation of (at least) XSLT 1.0 as implemented in Apache Xalan
*** a document can of course only have a single document type
*** e.g. we can not include a doctype node in the result tree of FunctionTransform
* implemented test case for FunctionGenerate
* transformation "test.xsl" is shared between the FunctionTransform and FunctionGenerate test cases
* modified README.md accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Simplified FunctionTransform test case helper templates</title>
<updated>2014-07-06T12:33:01+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-07-06T12:33:01+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=e172aee6569df6a3f9abd8cd647eded1bb0612b3'/>
<id>e172aee6569df6a3f9abd8cd647eded1bb0612b3</id>
<content type='text'>
* as FunctionTransform returns the result as a DOM tree there is no reason for including the separately tested FunctionWriteFile in this test case
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* as FunctionTransform returns the result as a DOM tree there is no reason for including the separately tested FunctionWriteFile in this test case
</pre>
</div>
</content>
</entry>
<entry>
<title>Revamped implementation to support FunctionTransform XalanNode input</title>
<updated>2014-07-05T19:55:48+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-07-05T19:55:48+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2'/>
<id>a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2</id>
<content type='text'>
* FunctionTransform now accepts xalan::XalanNode base xalan::XSLTInputSource instances as input parameter
** such xalan::XSLTInputSource instances were already supported for the stylesheet parameter but not for the input parameter
** e.g. it is now possible to generate a DOM inside a transformation, pass the DOM into a embedded transformation as input, modifiy the output of that transformation, pass this modified DOM into another transformation and so on... you get the point
* this required a revamp of TransformationFacade
** it is now a transformation independent wrapper for xalan::XalanTransformer
*** as such is was renamed to TransformerFacade
** removed error catching template factory method "try_create" as it is not needed anymore
** "std::basic_ostream&lt;char&gt;&amp;" taking "generate" member method overloads were removed
** the set of "generate" member overloads was reduced to two methods accepting xalan::XSLTInputSource and xalan::FormatterListener as parameters
* the core problem first documented in 299d0f6 was solved by transforming the input parameter into a xerces DOM and wrapping this DOM inside a xalan::XercesDOMWrapperParsedSource instance
* serialization of the transformation result for file / std::cout output is now performed directly by the ixslt frontend
* removed 'stylesheet parameter' parameter from FunctionTransform
** the functionality provided by this is easily replicated using the now possible DOM input parameter
** this was done to simplify the interface and reduce unnecessary feature duplication
* updated FunctionTransform test case accordingly
* added "generate" template function to ixslt frontend
** wraps TransformerFacade and manages ist input arguments
** handles serialization to stream
* this commit marks a important milestone towards the goals defined in 741a70f
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* FunctionTransform now accepts xalan::XalanNode base xalan::XSLTInputSource instances as input parameter
** such xalan::XSLTInputSource instances were already supported for the stylesheet parameter but not for the input parameter
** e.g. it is now possible to generate a DOM inside a transformation, pass the DOM into a embedded transformation as input, modifiy the output of that transformation, pass this modified DOM into another transformation and so on... you get the point
* this required a revamp of TransformationFacade
** it is now a transformation independent wrapper for xalan::XalanTransformer
*** as such is was renamed to TransformerFacade
** removed error catching template factory method "try_create" as it is not needed anymore
** "std::basic_ostream&lt;char&gt;&amp;" taking "generate" member method overloads were removed
** the set of "generate" member overloads was reduced to two methods accepting xalan::XSLTInputSource and xalan::FormatterListener as parameters
* the core problem first documented in 299d0f6 was solved by transforming the input parameter into a xerces DOM and wrapping this DOM inside a xalan::XercesDOMWrapperParsedSource instance
* serialization of the transformation result for file / std::cout output is now performed directly by the ixslt frontend
* removed 'stylesheet parameter' parameter from FunctionTransform
** the functionality provided by this is easily replicated using the now possible DOM input parameter
** this was done to simplify the interface and reduce unnecessary feature duplication
* updated FunctionTransform test case accordingly
* added "generate" template function to ixslt frontend
** wraps TransformerFacade and manages ist input arguments
** handles serialization to stream
* this commit marks a important milestone towards the goals defined in 741a70f
</pre>
</div>
</content>
</entry>
<entry>
<title>Changed FunctionTransform result type to node-set</title>
<updated>2014-07-04T20:41:17+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-07-04T20:41:17+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=f05e742b88e3ebf7401c252332022f1a2f7eb8b0'/>
<id>f05e742b88e3ebf7401c252332022f1a2f7eb8b0</id>
<content type='text'>
* using xalan::FormatterToXercesDOM internally
** this required changes to the TransformationFacade::generate member method overloads
* TransformationFacade::generate now accepts references to xalan::FormatterListener instances
** "generate(std::basic_ostream&lt;char&gt;&amp;..." instantiates a xalan::FormatterToXML and passes it to the actual generate member method
* changed ResultNodeFacade's "getNode" method into a "getResultElement" method
** xalan::FormatterToXercesDOM requires a xercesc::DOMElement instance instead of the previously available xercesc::DOMNode instance
** changed FunctionReadDirectory accordingly
* adapted FunctionTransform test case accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* using xalan::FormatterToXercesDOM internally
** this required changes to the TransformationFacade::generate member method overloads
* TransformationFacade::generate now accepts references to xalan::FormatterListener instances
** "generate(std::basic_ostream&lt;char&gt;&amp;..." instantiates a xalan::FormatterToXML and passes it to the actual generate member method
* changed ResultNodeFacade's "getNode" method into a "getResultElement" method
** xalan::FormatterToXercesDOM requires a xercesc::DOMElement instance instead of the previously available xercesc::DOMNode instance
** changed FunctionReadDirectory accordingly
* adapted FunctionTransform test case accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Removed unnecessary template member methods from TranformationFacade</title>
<updated>2014-07-01T18:54:02+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-07-01T18:54:02+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=784ac42a0f05608e3d9c5e15246dbf76ce9e3d51'/>
<id>784ac42a0f05608e3d9c5e15246dbf76ce9e3d51</id>
<content type='text'>
* neither the constructor nor the generate member methods need to be templatized
** only supported "output" argument is now a reference to a "std::basic_ostream&lt;char&gt;" instance
** the caller is responsible for e.g. writing the output to disk
* this was done to simplify the basic interface of InputXSLT
* removed "default_params" testcase along with default parameter generation
** this feature is neither used nor required
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* neither the constructor nor the generate member methods need to be templatized
** only supported "output" argument is now a reference to a "std::basic_ostream&lt;char&gt;" instance
** the caller is responsible for e.g. writing the output to disk
* this was done to simplify the basic interface of InputXSLT
* removed "default_params" testcase along with default parameter generation
** this feature is neither used nor required
</pre>
</div>
</content>
</entry>
<entry>
<title>Improved "external-text-formatter" test case helper template</title>
<updated>2014-06-30T17:38:02+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-30T17:38:02+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=2becbedf4cb779b56578e495293b850ff05b738f'/>
<id>2becbedf4cb779b56578e495293b850ff05b738f</id>
<content type='text'>
* test cases should also provide examples of how the tested external functions may be integrated into transformations
** helper templates such as "formatter" or "transformer" are an important step into this direction
** especially functions other than plain read-only functions fit much better into a template context than a XPath context
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* test cases should also provide examples of how the tested external functions may be integrated into transformations
** helper templates such as "formatter" or "transformer" are an important step into this direction
** especially functions other than plain read-only functions fit much better into a template context than a XPath context
</pre>
</div>
</content>
</entry>
<entry>
<title>Switched FunctionWriteFile content parameter to xalan::XalanNode pointer</title>
<updated>2014-06-29T18:36:28+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-29T18:36:28+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=bd39d49464dbd17eb3d4cdbb5784431e43e56fbf'/>
<id>bd39d49464dbd17eb3d4cdbb5784431e43e56fbf</id>
<content type='text'>
* i.e. "write-file" now supports the serialization of given DOM structures
** this will be needed e.g. if FunctionTransform returns the result as a DOM tree instead of as a plain string
** enables the creation of multiple XML documents from within a single transformation
*** i.e. backports the functionality provided in XSLT 2.0 by "xsl:result-document" to xalan's XSLT 1.0
* changed test cases accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* i.e. "write-file" now supports the serialization of given DOM structures
** this will be needed e.g. if FunctionTransform returns the result as a DOM tree instead of as a plain string
** enables the creation of multiple XML documents from within a single transformation
*** i.e. backports the functionality provided in XSLT 2.0 by "xsl:result-document" to xalan's XSLT 1.0
* changed test cases accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Added input parameter to FunctionTransform</title>
<updated>2014-06-28T16:09:48+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-28T16:09:48+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=299d0f6fa3fbd1bfd8d1d6d452e9d055973d0e0e'/>
<id>299d0f6fa3fbd1bfd8d1d6d452e9d055973d0e0e</id>
<content type='text'>
* the external "transform" function now expects a input document as its first parameter
** this input parameter is resolved and passed as input to the transformation
** changed and expanded test case accordingly
* because of xalan internal problem this currently only supports input DOMs loaded directly from the fs
** passing result trees or node sets analog to how the transformation may be passed into the function leads to parsing and assert failures
** parsing node-based input DOMs using xalanc::XalanTransformer::parseSource produces errors concerning base entity resolution
** if the error capacitor instance is temporarily disabled it works correctly as long as one doesn't try to access the input document
*** this causes a assert failure in the XPath implementation (seems to be related to XALANC-540)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* the external "transform" function now expects a input document as its first parameter
** this input parameter is resolved and passed as input to the transformation
** changed and expanded test case accordingly
* because of xalan internal problem this currently only supports input DOMs loaded directly from the fs
** passing result trees or node sets analog to how the transformation may be passed into the function leads to parsing and assert failures
** parsing node-based input DOMs using xalanc::XalanTransformer::parseSource produces errors concerning base entity resolution
** if the error capacitor instance is temporarily disabled it works correctly as long as one doesn't try to access the input document
*** this causes a assert failure in the XPath implementation (seems to be related to XALANC-540)
</pre>
</div>
</content>
</entry>
<entry>
<title>Updated README.md and added "write-file" test case</title>
<updated>2014-06-27T19:35:46+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-27T19:35:46+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=a8be7f7dde5cf0d51026de0e6bc4d0f59f41c4b6'/>
<id>a8be7f7dde5cf0d51026de0e6bc4d0f59f41c4b6</id>
<content type='text'>
* slightly improved FunctionTransform test case utility templates
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* slightly improved FunctionTransform test case utility templates
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented basic external "write-file" function</title>
<updated>2014-06-26T18:26:32+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-26T18:26:32+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=266b408ee53b9bc7db2b1a5c92e62adfd2af6def'/>
<id>266b408ee53b9bc7db2b1a5c92e62adfd2af6def</id>
<content type='text'>
* accepts a path parameter and the content to be written
* removed target parameter form FunctionTransform
** transformation result is now returned as a string
*** nodeset return value is planned
** e.g. writing the result to the fs is optional and has to be achieved using FunctionWriteFile
* changed "transform" test case accordingly
* this marks a paradigm shift and is the continuation of the changes described in 741a70f
** InputXSLT now also implements a output function
* added basic io error handling to FunctionReadFile
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* accepts a path parameter and the content to be written
* removed target parameter form FunctionTransform
** transformation result is now returned as a string
*** nodeset return value is planned
** e.g. writing the result to the fs is optional and has to be achieved using FunctionWriteFile
* changed "transform" test case accordingly
* this marks a paradigm shift and is the continuation of the changes described in 741a70f
** InputXSLT now also implements a output function
* added basic io error handling to FunctionReadFile
</pre>
</div>
</content>
</entry>
<entry>
<title>Added support for resolving non-existing paths</title>
<updated>2014-06-25T18:23:35+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-25T18:23:35+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=7b872121000d4db4026d0c90fcb95a10f1e43694'/>
<id>7b872121000d4db4026d0c90fcb95a10f1e43694</id>
<content type='text'>
* previous logic for resolving boost::filesystem::path parameters in the XObjectValue class actively tried to resolve existing files
** this contradicts the planned introduction of e.g. a external "write-file" function
* callers of external functions with path arguments now have to enclose them in square brackets if include path resolution is required
** analog to the usage of the "xsl:import" tag
* moved "getPathFromSystemId" from compilation local method into static method of IncludeEntityResolver
* changed test cases accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* previous logic for resolving boost::filesystem::path parameters in the XObjectValue class actively tried to resolve existing files
** this contradicts the planned introduction of e.g. a external "write-file" function
* callers of external functions with path arguments now have to enclose them in square brackets if include path resolution is required
** analog to the usage of the "xsl:import" tag
* moved "getPathFromSystemId" from compilation local method into static method of IncludeEntityResolver
* changed test cases accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Added context awareness to XObjectValue casting logic</title>
<updated>2014-06-17T19:28:04+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-17T19:28:04+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=0d670478b51c55e44f57995fe3ca8a4585723a6c'/>
<id>0d670478b51c55e44f57995fe3ca8a4585723a6c</id>
<content type='text'>
* added support for defining boost::filesystem::path as a external function parameter
** boost::filesystem::path parameters are resolved against the appropriate FilesystemContext and IncludeEntityResolver instances
* xalan::XSLTInputSource parameter source paths are also resolved
* removed need for passing a reference FilesystemContext to "constructDocument" methods
** they now only accept the parameters of the external function implemented by them
** all path resolution logic is wrapped by the newly created XObjectValue class
* converted XObjectValue namespace into class
** the "get" template method is now a template member method
** this was needed to enable value casting logic to access the appropriate FilesystemContext and IncludeEntityResolver instances
* this commit marks the next step towards the goals defined in 741a70f
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* added support for defining boost::filesystem::path as a external function parameter
** boost::filesystem::path parameters are resolved against the appropriate FilesystemContext and IncludeEntityResolver instances
* xalan::XSLTInputSource parameter source paths are also resolved
* removed need for passing a reference FilesystemContext to "constructDocument" methods
** they now only accept the parameters of the external function implemented by them
** all path resolution logic is wrapped by the newly created XObjectValue class
* converted XObjectValue namespace into class
** the "get" template method is now a template member method
** this was needed to enable value casting logic to access the appropriate FilesystemContext and IncludeEntityResolver instances
* this commit marks the next step towards the goals defined in 741a70f
</pre>
</div>
</content>
</entry>
<entry>
<title>Prepared TransformationFacade and FunctionTransform for parameter change</title>
<updated>2014-06-16T21:01:23+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-16T21:01:23+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=741a70f5fecc38033832728f4ecc62a6abe328b2'/>
<id>741a70f5fecc38033832728f4ecc62a6abe328b2</id>
<content type='text'>
* FunctionTransform was adapted to support passing the transformation as either a string path or directly as a node-set / result-tree
** this in turn required changes to the TransformationFacade
** the implementation of a xalan::XSLTInputSource specialization for the XObjectValue::get template method was also required
* changed ixslt executable to match TransformationFacade constructor changes
* these changes were implemented in preparation for a restructuring of how the separate external functions provided by InputXSLT operate and work together
** the approach up until now was to provide non-combinable external functions for distinct task such as "read a file" and "transform that transformation using these parameters into that file"
** if you think about the areas of operations of these functions are overlapping quite a bit
*** e.g. FunctionTransform reads files, transforms DOM structures and writes files instead of only transforming things
** the new approach will be to limit the feature set of each function in the attempt of making the clearer and increasing their combinability
*** e.g. FunctionTransform won't read or write files but expect both the input-DOM and the transformation-DOM as node-sets or result trees and return the transformed document as a node-set to be written using FunctionWriteFile (to be implemented)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* FunctionTransform was adapted to support passing the transformation as either a string path or directly as a node-set / result-tree
** this in turn required changes to the TransformationFacade
** the implementation of a xalan::XSLTInputSource specialization for the XObjectValue::get template method was also required
* changed ixslt executable to match TransformationFacade constructor changes
* these changes were implemented in preparation for a restructuring of how the separate external functions provided by InputXSLT operate and work together
** the approach up until now was to provide non-combinable external functions for distinct task such as "read a file" and "transform that transformation using these parameters into that file"
** if you think about the areas of operations of these functions are overlapping quite a bit
*** e.g. FunctionTransform reads files, transforms DOM structures and writes files instead of only transforming things
** the new approach will be to limit the feature set of each function in the attempt of making the clearer and increasing their combinability
*** e.g. FunctionTransform won't read or write files but expect both the input-DOM and the transformation-DOM as node-sets or result trees and return the transformed document as a node-set to be written using FunctionWriteFile (to be implemented)
</pre>
</div>
</content>
</entry>
<entry>
<title>Merged "read-xml-file" and "read-file" into "read-file"</title>
<updated>2014-06-15T13:14:46+00:00</updated>
<author>
<name>Adrian Kummerlaender</name>
</author>
<published>2014-06-15T13:14:46+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=32c65970263c65022f5278b568c07b63c3d5d64b'/>
<id>32c65970263c65022f5278b568c07b63c3d5d64b</id>
<content type='text'>
* FunctionReadFile is now able to distinguish between XML files and plain text files
** it selects the appropriate course of action automatically
** reading the file as XML into the DOM or reading it as a string
* the current selection criteria is the file extension
** I am thinking about trying to import every file into the DOM and using the result state of that action as selection criteria
* Updated README.md and test cases accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* FunctionReadFile is now able to distinguish between XML files and plain text files
** it selects the appropriate course of action automatically
** reading the file as XML into the DOM or reading it as a string
* the current selection criteria is the file extension
** I am thinking about trying to import every file into the DOM and using the result state of that action as selection criteria
* Updated README.md and test cases accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Renamed "test" executable to "ixslt"</title>
<updated>2014-06-04T19:22:18+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-06-04T19:22:18+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=11355181c0b5f8377774daefcc17bb5e6bc20f61'/>
<id>11355181c0b5f8377774daefcc17bb5e6bc20f61</id>
<content type='text'>
* improved "ixslt" frontend code structure
** extracted input, process and output logic into separate methods
** removed manual "--transformation" parameter check as it is defined as required
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* improved "ixslt" frontend code structure
** extracted input, process and output logic into separate methods
** removed manual "--transformation" parameter check as it is defined as required
</pre>
</div>
</content>
</entry>
<entry>
<title>Simplified test case result variable definitions</title>
<updated>2014-06-01T15:31:17+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-06-01T15:31:17+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=6b5da054693cd348f3c357dbf1c8cb1979fecf6a'/>
<id>6b5da054693cd348f3c357dbf1c8cb1979fecf6a</id>
<content type='text'>
* variables containing the output of a external function can be defined using the "select" attribute
** tree-like definition is only needed when helper templates such as "transformer" are used
** queries on variables that are instantiated in this fashion need the "self::" prefix before base nodes
* changed includes of the "testcase.xsl" base template to imports
** this signifies that the importing template is based on the imported template
** ... and this is exactly what we want to define
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* variables containing the output of a external function can be defined using the "select" attribute
** tree-like definition is only needed when helper templates such as "transformer" are used
** queries on variables that are instantiated in this fashion need the "self::" prefix before base nodes
* changed includes of the "testcase.xsl" base template to imports
** this signifies that the importing template is based on the imported template
** ... and this is exactly what we want to define
</pre>
</div>
</content>
</entry>
<entry>
<title>Revamped external function result trees</title>
<updated>2014-05-31T12:18:48+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-31T12:18:48+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=1a744712426c9c19019b8ebebdd0c703aae204a6'/>
<id>1a744712426c9c19019b8ebebdd0c703aae204a6</id>
<content type='text'>
* the root node of the result tree of each function is a domain element
** i.e. the root node of "read-xml-file" is "file", the root node of "read-directory" is "directory"
* the root node contains the result state of the function call encoded in a "result" attribute
** possible values are "success" and "error"
** the root node may contain additional attributes such as the target path of a called transformation
* the actual function result is contained within the child nodes of the function root node
** i.e. the XML file tree returned by "read-xml-file" is a child of the function root node
** if specific errors occured they are also returned as child nodes of the function root node
*** this is currently only the case for "transform" where transformation errors are returned as "error" value node childs of the function root node
* updated test cases accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* the root node of the result tree of each function is a domain element
** i.e. the root node of "read-xml-file" is "file", the root node of "read-directory" is "directory"
* the root node contains the result state of the function call encoded in a "result" attribute
** possible values are "success" and "error"
** the root node may contain additional attributes such as the target path of a called transformation
* the actual function result is contained within the child nodes of the function root node
** i.e. the XML file tree returned by "read-xml-file" is a child of the function root node
** if specific errors occured they are also returned as child nodes of the function root node
*** this is currently only the case for "transform" where transformation errors are returned as "error" value node childs of the function root node
* updated test cases accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Improved TransformationFacade error handling</title>
<updated>2014-05-29T11:26:37+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-29T11:26:37+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=3bc793d95293d40dbab62c593ce4ceaa86fae25b'/>
<id>3bc793d95293d40dbab62c593ce4ceaa86fae25b</id>
<content type='text'>
* ErrorHandler class created in 5859cb6 now caches all errors instead of pushing them to std::cerr
** cached errors are retrieved by TransformationFacade's "generate" member method
* test frontend pushes all errors to std::cerr
* FunctionTransform returns errors to the calling template as XML
** FunctionTransform test case demonstrates how one may test for successful transformation
* "generate" member method returns std::string vector wrapped in a std::unique_ptr
** this is used as a kind of optional pointer, as the std::unique_ptr instance only wraps a vector if errors where actually generated
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* ErrorHandler class created in 5859cb6 now caches all errors instead of pushing them to std::cerr
** cached errors are retrieved by TransformationFacade's "generate" member method
* test frontend pushes all errors to std::cerr
* FunctionTransform returns errors to the calling template as XML
** FunctionTransform test case demonstrates how one may test for successful transformation
* "generate" member method returns std::string vector wrapped in a std::unique_ptr
** this is used as a kind of optional pointer, as the std::unique_ptr instance only wraps a vector if errors where actually generated
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented basic ErrorHandler</title>
<updated>2014-05-28T19:51:39+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-28T19:51:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=5859cb6af4a5136a96971c47e41e6195007ef944'/>
<id>5859cb6af4a5136a96971c47e41e6195007ef944</id>
<content type='text'>
* InputXSLT::ErrorHandler is derived from xercesc::ErrorHandler and enables contextual printing of transformation errors
** currently this means that the error messages passed to std::cerr contain the full path of the offending transformation
* added input trimming to the external transform function
** calls to this function from inside a transformation may contain unnecessary whitespace characters which disrupt further processing
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* InputXSLT::ErrorHandler is derived from xercesc::ErrorHandler and enables contextual printing of transformation errors
** currently this means that the error messages passed to std::cerr contain the full path of the offending transformation
* added input trimming to the external transform function
** calls to this function from inside a transformation may contain unnecessary whitespace characters which disrupt further processing
</pre>
</div>
</content>
</entry>
<entry>
<title>Expanded "read-directory" test case</title>
<updated>2014-05-27T19:25:40+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-27T19:25:40+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=802d416040aa31d72defa7a9227cd31b0885bc60'/>
<id>802d416040aa31d72defa7a9227cd31b0885bc60</id>
<content type='text'>
* verifying type attribute and extension value node if available
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* verifying type attribute and extension value node if available
</pre>
</div>
</content>
</entry>
<entry>
<title>Added "external-text-formatter" test case</title>
<updated>2014-05-26T18:13:11+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-26T18:13:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=6efa3385ae0fab5f7b6e3a113d1da18cfbed8591'/>
<id>6efa3385ae0fab5f7b6e3a113d1da18cfbed8591</id>
<content type='text'>
* test case requires markdown.pl formatter to be available in "/usr/bin/"
* updated README.md to mention "external-text-formatter" instead of "execute"
* updated "read-directory" test case reference file
* included library resolution test into "read-file" and "read-xml-file" test cases
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* test case requires markdown.pl formatter to be available in "/usr/bin/"
* updated README.md to mention "external-text-formatter" instead of "execute"
* updated "read-directory" test case reference file
* included library resolution test into "read-file" and "read-xml-file" test cases
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented ResultNodeFacade as a DOM node construction helper</title>
<updated>2014-05-24T11:59:42+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-24T11:59:42+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=085935ddd577b0c65b4330318b5ba20492d93126'/>
<id>085935ddd577b0c65b4330318b5ba20492d93126</id>
<content type='text'>
* wraps result node construction and appends it to root node on destruction
* offers a simpler interface for common node construction patterns
* simplifies result node construction in all external function implementations
** most noticeable in FunctionReadDirectory
* expanded FunctionReadDirectory result nodes by name, extension, and full-path nodes
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* wraps result node construction and appends it to root node on destruction
* offers a simpler interface for common node construction patterns
* simplifies result node construction in all external function implementations
** most noticeable in FunctionReadDirectory
* expanded FunctionReadDirectory result nodes by name, extension, and full-path nodes
</pre>
</div>
</content>
</entry>
<entry>
<title>Added test case base template and improved transformer helper template</title>
<updated>2014-05-21T18:30:37+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-21T18:30:37+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=283101c02a7e6a71f221fe731168e9b0096e3766'/>
<id>283101c02a7e6a71f221fe731168e9b0096e3766</id>
<content type='text'>
* test case base template contains the basic test case markup
** it was mostly created to include include-path resolution into the test cases
* improved transformer helper template by separating the external function call into its own variable
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* test case base template contains the basic test case markup
** it was mostly created to include include-path resolution into the test cases
* improved transformer helper template by separating the external function call into its own variable
</pre>
</div>
</content>
</entry>
<entry>
<title>Improved FunctionTransform test case transformations</title>
<updated>2014-05-17T11:59:33+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-17T11:59:33+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=246a8e020d97cfc3b4409996f99450fa95b730b1'/>
<id>246a8e020d97cfc3b4409996f99450fa95b730b1</id>
<content type='text'>
* added basic "transformer" wrapper template to call "InputXSLT:transform"
** this removes the need to specifiy arguments in a separate xslt variable
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* added basic "transformer" wrapper template to call "InputXSLT:transform"
** this removes the need to specifiy arguments in a separate xslt variable
</pre>
</div>
</content>
</entry>
<entry>
<title>Added XObjectPtr parameter to FunctionTransform</title>
<updated>2014-05-16T20:25:39+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-16T20:25:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=7bd543e220c806177d805a8f4fbc13e951fe5788'/>
<id>7bd543e220c806177d805a8f4fbc13e951fe5788</id>
<content type='text'>
* the given XObject is passed to the called transformation
** this was done to enable templates to pass information to each other
** this should support any type usable in a XPath context to be passed as an argument
* expanded FunctionTransform test case accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* the given XObject is passed to the called transformation
** this was done to enable templates to pass information to each other
** this should support any type usable in a XPath context to be passed as an argument
* expanded FunctionTransform test case accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Sorting FilesystemContext iteration results</title>
<updated>2014-05-13T14:30:58+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-13T14:30:58+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=b3bf487144a1a2978cc17d40b6d6ba1c0467fc37'/>
<id>b3bf487144a1a2978cc17d40b6d6ba1c0467fc37</id>
<content type='text'>
* order of items in a directory was varying across platforms which hindered testability
* they are now temporarily copied into a std::vector instance and then sorted using std::sort
* updated "read_directory" test case reference file accordingly
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* order of items in a directory was varying across platforms which hindered testability
* they are now temporarily copied into a std::vector instance and then sorted using std::sort
* updated "read_directory" test case reference file accordingly
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented basic external transform function</title>
<updated>2014-05-12T16:49:24+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-12T16:49:24+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=c4fcfa9b39d9c29ecbc3ac1c12b7e5b2beb24a6d'/>
<id>c4fcfa9b39d9c29ecbc3ac1c12b7e5b2beb24a6d</id>
<content type='text'>
* "InputXSLT:transform" expects two input arguments and executes the given transformation into the given target file
** this function respresents a important step in the direction of making it possible to write an actual static site generator on top of InputXSLT using XSLT
* added basic "transform" test case
* updated README.md to include this new function
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* "InputXSLT:transform" expects two input arguments and executes the given transformation into the given target file
** this function respresents a important step in the direction of making it possible to write an actual static site generator on top of InputXSLT using XSLT
* added basic "transform" test case
* updated README.md to include this new function
</pre>
</div>
</content>
</entry>
<entry>
<title>Added default target file and path parameters</title>
<updated>2014-05-09T19:29:39+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-09T19:29:39+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=47b3bb0882a838ba794f105f3dc93ec45f5e1727'/>
<id>47b3bb0882a838ba794f105f3dc93ec45f5e1727</id>
<content type='text'>
* the transformation is now provided with default parameters such as the target file and its parent directory
* added appropriate test case
** default_params
* test frontend now doesn't provide a "test" parameter anymore
* extracted parameter setter into separate member method "setParameters" of TransformationFacade
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* the transformation is now provided with default parameters such as the target file and its parent directory
* added appropriate test case
** default_params
* test frontend now doesn't provide a "test" parameter anymore
* extracted parameter setter into separate member method "setParameters" of TransformationFacade
</pre>
</div>
</content>
</entry>
<entry>
<title>Implemented black-box test cases</title>
<updated>2014-05-08T19:16:31+00:00</updated>
<author>
<name>Adrian Kummerländer</name>
</author>
<published>2014-05-08T19:16:31+00:00</published>
<link rel='alternate' type='text/html' href='https://code.kummerlaender.eu/InputXSLT/commit/?id=947603b5d7f05053a93a3cfe257fa7ab11304a90'/>
<id>947603b5d7f05053a93a3cfe257fa7ab11304a90</id>
<content type='text'>
* the directories below "./test" contain test cases
** "transformation.xsl" and the expected result as "reference.xml"
** tests are performed by "check.sh"
*** returns diff on error
* this system enables simple verification of external function results
** way simpler than C++ unit tests would be in this scenario
* expanded cmake instructions to automatically execute the test cases
* old example transformation was removed
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* the directories below "./test" contain test cases
** "transformation.xsl" and the expected result as "reference.xml"
** tests are performed by "check.sh"
*** returns diff on error
* this system enables simple verification of external function results
** way simpler than C++ unit tests would be in this scenario
* expanded cmake instructions to automatically execute the test cases
* old example transformation was removed
</pre>
</div>
</content>
</entry>
</feed>
