Create xslt files programmatically

2019-01-19 08:54发布

I know that I can create xml files programmatically by using DOM api in java like the following:

DocumentBuilderFactory documentBuilderFactory = 
    DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

Document document = documentBuilder.newDocument();
Element rootElement = document.createElement("map");
document.appendChild(rootElement);

Element em = document.createElement("string");
em.setAttribute("name", "FirstName");
....

But are there any API 's to construct an xslt tree? (an api like Dom for example)

I need somehing like this:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
<xsl:template match="root">
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="my-page">
      <fo:region-body margin="1in"/>
    </fo:simple-page-master>
  </fo:layout-master-set>

  <fo:page-sequence master-reference="my-page">
    <fo:flow flow-name="xsl-region-body">
      <fo:block>
        <fo:external-graphic width="100pt" height="100pt" content-width="50pt" content-height="50pt" src="images/shopping-cart_100.jpg"/>
      </fo:block>
      <fo:block>Good Morning, <xsl:value-of select="name" />!</fo:block>
      <fo:block>
        <fo:table>
             <fo:table-body>
                <fo:table-row>
                    <fo:table-cell border="solid 1px black" text-align="center" font-weight="bold">
                        <fo:block>

and:

              <xsl:for-each select="./friend">
                <fo:table-row>
                <fo:table-cell border="solid 1px black" text-align="center">
                    <fo:block>
                        <xsl:value-of select="position()" />
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell border="solid 1px black" text-align="center">
                    <fo:block>
                        <xsl:value-of select="name" />
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell border="solid 1px black" text-align="center">

Thanks in advance.

3条回答
再贱就再见
2楼-- · 2019-01-19 09:20

Since XSLT it's XML too, you can simply use the same strategy:

...
Document document = documentBuilder.newDocument();

Element rootElement = document.createElement("xsl:stylesheet");
// adding attributes like namespaces etc...

document.appendChild(rootElement); 
Element em = document.createElement("xsl:template");
em.setAttribute("match", "/");

and so on...

But it's not very elegant. You should use a library or a framework instead, you should easily find one googling around.

查看更多
孤傲高冷的网名
3楼-- · 2019-01-19 09:24

DOM is a pretty cumbersome way of creating XML.

There's a far better way - use XSLT.

The more complex the XML, the bigger the win from using XSLT rather than DOM to create it.

There's no reason why you can't use XSLT to create XSLT (there's even a special declaration xsl:namespace-alias to make it a little bit easier - searching for xsl:namespace-alias will show up examples of its use.

查看更多
三岁会撩人
4楼-- · 2019-01-19 09:26

You can create an XSLT the same way you create an XML file, since XSLTs are XML files.

However, if you have to deal with XML/XSLT transformations a lot, Apache Cocoon 3 has a very lightweight XML/XSLT pipeline system to use as a library instead of dealing with all XML dom stuff and XSLT transformations manually.

查看更多
登录 后发表回答