{"id":1809,"date":"2011-05-26T09:02:39","date_gmt":"2011-05-26T14:02:39","guid":{"rendered":"http:\/\/jianmingli.com\/wp\/?p=1809"},"modified":"2011-05-26T09:06:13","modified_gmt":"2011-05-26T14:06:13","slug":"xslt","status":"publish","type":"post","link":"https:\/\/jianmingli.com\/wp\/?p=1809","title":{"rendered":"XSLT"},"content":{"rendered":"<span id=\"Overview\"><h2>Overview<\/h2><\/span>\n<p>* XSL stands for EXtensible Stylesheet Language.<br \/>\n* XSLT stands for XSL Transformations<br \/>\n* XSLT transforms an XML document into another XML document<br \/>\n* XSLT uses XPath to navigate in XML documents<br \/>\n* XSLT is a W3C Recommendation<\/p>\n<span id=\"Top_Level_Elements\"><h3>Top Level Elements<\/h3><\/span>\n<span id=\"xlt:import_and_xlt:include\"><h4>xlt:import and xlt:include<\/h4><\/span>\n<p>* Both reference another style sheet.<br \/>\n* Style sheet imported with xlt:import has lower priority so current style sheet can override imported style sheet.<br \/>\n* xlt:import can only appear at the beginning of style sheet.<\/p>\n<span id=\"xlt:strip-space_and_xlt:preserve-space\"><h4>xlt:strip-space and xlt:preserve-space<\/h4><\/span>\n<pre lang=\"xml\">\r\n<xsl:strip-space elements=\"*\"\/>\r\n<xsl:preserve-space elements=\"greeting salutation\"\/>\r\n<\/pre>\n<span id=\"Preserve_XML_indents\"><h4>Preserve XML indents<\/h4><\/span>\n<p>Often times you want to preserve the xml output for readability. Here is how to achieve it.<\/p>\n<pre lang=\"xml\"><xsl:output method=\"xml\" indent=\"yes\"\/><\/pre>\n<span id=\"xlt:key\"><h4>xlt:key<\/h4><\/span>\n<span id=\"xsl:variable\"><h4>xsl:variable<\/h4><\/span>\n<span id=\"xsl:param\"><h4>xsl:param<\/h4><\/span>\n<span id=\"Extend_XSLT\"><h2>Extend XSLT<\/h2><\/span>\n<p>You can extend XSLT by<br \/>\n* Extension element<br \/>\n* Extension function<\/p>\n<span id=\"XPath\"><h2>XPath<\/h2><\/span>\n<span id=\"XPath_2.0\"><h3>XPath 2.0<\/h3><\/span>\n<p>* Everything is sequence.<br \/>\n* Supports atomic values such xs:integer which can not be broken down to smaller parts.<br \/>\n* Supports all build-in data types of XML schema.<\/p>\n<span id=\"XPath_Node_Types\"><h3>XPath Node Types<\/h3><\/span>\n<p>* The document node<br \/>\n&#8211; One per document<br \/>\n&#8211; No parent<br \/>\n* Element nodes<br \/>\n* Attribute nodes<br \/>\n* Text nodes<br \/>\n* Comment nodes<br \/>\n* Processing instruction nodes<br \/>\n* Namespace nodes<\/p>\n<span id=\"Node_Tests\"><h3>Node Tests<\/h3><\/span>\n<p>* node()<br \/>\n&#8211; Matches any node.<br \/>\n* text()<br \/>\n&#8211; Matches text nodes only.<br \/>\n* comment()<br \/>\n&#8211; Matches comment nodes only.<br \/>\n* processing-instruction()<br \/>\n&#8211; Matches processing instructions only.<br \/>\n* NCName:*<br \/>\n&#8211; Matches all nodes in a particular name space.<\/p>\n<span id=\"XPath_2.0_Node_Tests\"><h4>XPath 2.0 Node Tests<\/h4><\/span>\n<p>* element()<br \/>\n&#8211; any element<br \/>\n&#8211; same as select=&#8221;*&#8221;<br \/>\n&#8211; element(author): matches any element named author.<br \/>\n&#8211; element(date-of-birth, xs:gYear): matches any element named date-of-birth with data type of xs:gYear.<br \/>\n&#8211;  element(*, xs:gYear): matches all elements of data type xs:gYear.<br \/>\n* schema-element(author)<br \/>\n&#8211; Matches any element named author which is declared in schema.<br \/>\n* attribute()<br \/>\n&#8211; same as select=&#8221;@*&#8221;<br \/>\n* *:NCName<br \/>\n&#8211; Matches all nodes with local name of NCName in any namespace.<br \/>\n* document-node()<br \/>\n&#8211; Matches a document node<\/p>\n<span id=\"Output_Text\"><h3>Output Text<\/h3><\/span>\n<p>* Use xsl:text for more control over white spaces.<br \/>\n* Use &lt;xsl:value-of select=&#8221;&#8221;\/&gt; to output values of something.<\/p>\n<pre lang=\"xml\">\r\n<xsl:value-of select=\"count(\/greetings\/greeting)\"\/>\r\n<\/pre>\n<span id=\"Branching\"><h2>Branching<\/h2><\/span>\n<p>* xsl:if<br \/>\n* xsl:choose<br \/>\n* xsl:for-each<\/p>\n<span id=\"Invoke_Template_by_Name\"><h3>Invoke Template by Name<\/h3><\/span>\n<pre lang=\"xml\">\r\n  <xsl:template match=\"\/\">\r\n     <xsl:call-template name=\"t2\"\/>\r\n  <\/xsl:template>\r\n\r\n  <xsl:template name=\"t1\" match=\"greeting\">\r\n        this is template 1.\r\n  <\/xsl:template>\r\n\r\n  <xsl:template name=\"t2\" match=\"greeting\">\r\n        this is template 2.\r\n  <\/xsl:template>\r\n<\/pre>\n<span id=\"Template_a_la_Mode\"><h3>Template a la Mode<\/h3><\/span>\n<pre lang=\"xml\">\r\n  <xsl:template match=\"\/\">\r\n    <html>\r\n      <body>\r\n        A la templates.\r\n        <xsl:apply-templates select=\"\/greetings\/greeting\" mode=\"alat1\"\/>\r\n        <xsl:apply-templates select=\"\/greetings\/greeting\" mode=\"alat2\"\/>\r\n      <\/body>\r\n    <\/html>\r\n  <\/xsl:template>\r\n\r\n  <xsl:template mode=\"alat1\" match=\"greeting\">\r\n      this is a la template 1.\r\n      <xsl:value-of select=\".\"\/>\r\n  <\/xsl:template>\r\n\r\n  <xsl:template mode=\"alat2\" match=\"greeting\">\r\n      this is a la template 2.\r\n      <xsl:value-of select=\".\"\/>\r\n  <\/xsl:template>\r\n<\/pre>\n<span id=\"Sample_Program_To_Do_XSLT\"><h2>Sample Program To Do XSLT<\/h2><\/span>\n<pre lang=\"java\">\r\npackage testxslt;\r\n\r\nimport java.io.File;\r\nimport javax.xml.transform.*;\r\nimport javax.xml.transform.stream.*;\r\n\r\npublic class TestXSLT1 {\r\n    public TestXSLT1() {\r\n    }\r\n\r\n    public static void main(String[] args) throws TransformerConfigurationException, \r\n                                                  TransformerException {\r\n        TestXSLT1 testxslt = new TestXSLT1();\r\n        testxslt.doTransform(\"HelloWorld.xml\",\"HelloWorld.xsl\");\r\n        testxslt.doTransform(\"HelloWorld.xml\",\"HelloWorld2.xsl\");\r\n    }\r\n\r\n    private void doTransform(String xml, String xsl) throws TransformerException, \r\n                                      TransformerConfigurationException {\r\n        Source xmlSrc = new StreamSource(new File(xml));\r\n        Source xsltSrc = new StreamSource(new File(xsl));\r\n        Result result = new StreamResult(System.out);\r\n        \r\n        TransformerFactory tf = TransformerFactory.newInstance();\r\n        Transformer t;\r\n\r\n        t = tf.newTransformer(xsltSrc);\r\n        t.transform(xmlSrc,result);\r\n    }\r\n}\r\n<\/pre>\n<span id=\"Examples\"><h2>Examples<\/h2><\/span>\n<p>* Output Indented XML format<\/p>\n<pre lang=\"xml\">\r\n <xsl:output method=\"xml\" indent=\"yes\"\/>\r\n<\/pre>\n<p>* Suppress empty and null nodes<\/p>\n<pre lang=\"xml\">\r\n<!-- Macro template -->\r\n<xsl:template name=\"writeElement\">\r\n  <xsl:param name=\"innode\"\/>\r\n  <xsl:param name=\"outname\"\/>\r\n  <xsl:if test=\"$innode[normalize-space(.) != ''] and $innode\/text() != 'NULL'\">\r\n    <xsl:element name=\"{$outname}\">\r\n      <xsl:value-of select=\"$innode\"\/>\r\n    <\/xsl:element>\r\n  <\/xsl:if>\r\n<\/xsl:template>\r\n\r\n<!-- Use maco template -->\r\n<xsl:call-template name=\"writeElement\">\r\n  <xsl:with-param name=\"innode\"\r\n                  select=\"myns:myOriginalNode\"\/>\r\n  <xsl:with-param name=\"outname\" select=\"'myTransformedNode'\"\/>\r\n<\/xsl:call-template>\r\n<\/pre>\n<span id=\"References\"><h2>References<\/h2><\/span>\n<p>* <a href=\"http:\/\/www.w3schools.com\/xsl\/default.asp\">XSLT Tutorial<\/a><br \/>\n* <a href=\"http:\/\/\">Java and XSLT<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Overview * XSL stands for EXtensible Stylesheet Language. * XSLT stands for XSL Transformations * XSLT transforms an XML document into another XML document * XSLT uses XPath to navigate in XML documents * XSLT is a W3C Recommendation Top &hellip; <a href=\"https:\/\/jianmingli.com\/wp\/?p=1809\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[98],"tags":[],"class_list":["post-1809","post","type-post","status-publish","format-standard","hentry","category-xslt"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/s8cRUO-xslt","_links":{"self":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1809"}],"version-history":[{"count":4,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1809\/revisions"}],"predecessor-version":[{"id":2465,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1809\/revisions\/2465"}],"wp:attachment":[{"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jianmingli.com\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}