Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 625
  • Last Modified:

XSL transfer to include inline schema

Hi Have an XML file that gets transformed to another XML file (some nodes are added). It worked fine until I added the XML schema in the original XML File.

I would like to have the Schema copied over to the output file (copy as is).

here is the XSLT that i am using: (thanks to Gertone for helping me get this far)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="NR">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="NR_DATA">
    <xsl:copy>
      <xsl:copy-of select="node()"/>
      <xsl:if test="count(NR_PART_REPLACMENT) &lt; 4">
        <xsl:call-template name="putExtraParts">
          <xsl:with-param name="cnt" select="4 - count(NR_PART_REPLACMENT) "/>
        </xsl:call-template>
      </xsl:if>
    </xsl:copy>
  </xsl:template>
  <xsl:template name="putExtraParts">
    <xsl:param name="cnt"/>
    <xsl:if test="$cnt &gt; 0">
      <NR_PART_REPLACMENT>
        <NRPR_ID></NRPR_ID>
        <NRPR_NR_ID></NRPR_NR_ID>
      </NR_PART_REPLACMENT>
      <xsl:call-template name="putExtraParts">
        <xsl:with-param name="cnt" select="$cnt - 1"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

HERE IS THE ORIGINAL XML (THIS ONE WORKS)
<?xml version="1.0" encoding="utf-16"?>
<NR>
  <NR_DATA>
    <NR_ID>1</NR_ID>
    <NR_PD_ID>1</NR_PD_ID>
    <NR_NRP_ID>1</NR_NRP_ID>
    <NR_WC_ID>16459</NR_WC_ID>
    <NR_WC_NUMBER>24-011-01-03</NR_WC_NUMBER>
    <NR_ATA_CODE>24</NR_ATA_CODE>
    <NR_ATA_SECTION>SYSTEMS AND POWERPLANT</NR_ATA_SECTION>
    <NR_ATA_SUBSECTION />
    <NR_CONTROL_NUMBER>C_1501</NR_CONTROL_NUMBER>
    <NR_TAIL_NUMBER>N2590G</NR_TAIL_NUMBER>
    <NR_SERVICE>CHECK</NR_SERVICE>
    <NR_STATION>IK</NR_STATION>
    <NR_DATE>2006-08-14T04:12:00-04:00</NR_DATE>
    <NR_ZONE>432</NR_ZONE>
    <NR_SKILL>ENGIN</NR_SKILL>
    <NR_ORIG_BY>0</NR_ORIG_BY>
    <NR_INSP_REQUIRED>0</NR_INSP_REQUIRED>
    <NR_APPROVAL_BY />
    <NR_ESTIMATED_MH_INSP>0</NR_ESTIMATED_MH_INSP>
    <NR_ESTIMATED_MH_MECH>0</NR_ESTIMATED_MH_MECH>
    <NR_STATUS>NEW</NR_STATUS>
    <NR_REQUISITION />
    <NR_REF_TYPE />
    <NR_REF_NUMBER />
    <NR_REF_LOCATION />
    <NR_CREATEDBY_ID>17</NR_CREATEDBY_ID>
    <NR_CREATEDBY_NAME>operator</NR_CREATEDBY_NAME>
    <NR_LAST_PRINT_URL>www</NR_LAST_PRINT_URL>
    <NR_DISCREPANCY>
      <NRD_ID>1</NRD_ID>
      <NRD_NR_ID>1</NRD_NR_ID>
      <NRD_DISCREPANCY>fff</NRD_DISCREPANCY>
      <NRD_CORRECTIVE_ACTION>gg</NRD_CORRECTIVE_ACTION>
      <NRD_ORDER>0</NRD_ORDER>
    </NR_DISCREPANCY>
    <NR_PART_REPLACMENT>
      <NRPR_ID>1</NRPR_ID>
      <NRPR_NR_ID>1</NRPR_NR_ID>
      <NRPR_PN_OFF>1</NRPR_PN_OFF>
      <NRPR_PN_ON>2</NRPR_PN_ON>
      <NRPR_SN_OFF>3</NRPR_SN_OFF>
      <NRPR_SN_ON>4</NRPR_SN_ON>
      <NRPR_TAG>5</NRPR_TAG>
      <NRPR_ORDER>0</NRPR_ORDER>
    </NR_PART_REPLACMENT>
  </NR_DATA>
</NR>


HERE IS THE NEW XML (I NEED THE TRANSFORMATION TO WORK ON THIS ONE):


<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="NR" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NR" msdata:IsDataSet="true" msdata:Locale="">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="NR_DATA">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="NR_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_PD_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_NRP_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_WC_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_WC_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_CODE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_SECTION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_SUBSECTION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_CONTROL_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_TAIL_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_SERVICE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_STATION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_DATE" type="xs:dateTime" minOccurs="0" />
              <xs:element name="NR_ZONE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_SKILL" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ORIG_BY" type="xs:int" minOccurs="0" />
              <xs:element name="NR_INSP_REQUIRED" type="xs:int" minOccurs="0" />
              <xs:element name="NR_APPROVAL_BY" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ESTIMATED_MH_INSP" type="xs:double" minOccurs="0"/>
              <xs:element name="NR_ESTIMATED_MH_MECH" type="xs:double" minOccurs="0"/>
              <xs:element name="NR_STATUS" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REQUISITION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_TYPE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_LOCATION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_CREATEDBY_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_CREATEDBY_NAME" type="xs:string" minOccurs="0" />
              <xs:element name="NR_LAST_PRINT_URL" type="xs:string" minOccurs="0" />
              <xs:element name="NR_DISCREPANCY" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="NRD_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRD_NR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRD_DISCREPANCY" type="xs:string" minOccurs="0" />
                    <xs:element name="NRD_CORRECTIVE_ACTION" type="xs:string" minOccurs="0" />
                    <xs:element name="NRD_ORDER" type="xs:int" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="NR_PART_REPLACMENT" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="NRPR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRPR_NR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRPR_PN_OFF" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_PN_ON" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_SN_OFF" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_SN_ON" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_TAG" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_ORDER" type="xs:int" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="NR_ATTACHMENT" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="FL_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_OWNER_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_OWNER_TYPE" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_FILE_TYPE" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_FILE_NAME" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_ORDER" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_NOTE" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_DATA" type="xs:base64Binary" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1">
      <xs:selector xpath=".//NR_DATA" />
      <xs:field xpath="NR_ID" />
    </xs:unique>
    <xs:keyref name="ATTACHMENTS" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_ATTACHMENT" />
      <xs:field xpath="FL_OWNER_ID" />
    </xs:keyref>
    <xs:keyref name="PARTS" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_PART_REPLACMENT" />
      <xs:field xpath="NRPR_NR_ID" />
    </xs:keyref>
    <xs:keyref name="DISCREPANCY" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_DISCREPANCY" />
      <xs:field xpath="NRD_NR_ID" />
    </xs:keyref>
  </xs:element>
</xs:schema>
<xs:schema id="NR" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NR" msdata:IsDataSet="true" msdata:Locale="">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="NR_DATA">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="NR_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_PD_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_NRP_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_WC_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_WC_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_CODE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_SECTION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ATA_SUBSECTION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_CONTROL_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_TAIL_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_SERVICE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_STATION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_DATE" type="xs:dateTime" minOccurs="0" />
              <xs:element name="NR_ZONE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_SKILL" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ORIG_BY" type="xs:int" minOccurs="0" />
              <xs:element name="NR_INSP_REQUIRED" type="xs:int" minOccurs="0" />
              <xs:element name="NR_APPROVAL_BY" type="xs:string" minOccurs="0" />
              <xs:element name="NR_ESTIMATED_MH_INSP" type="xs:double" minOccurs="0" />
              <xs:element name="NR_ESTIMATED_MH_MECH" type="xs:double" minOccurs="0" />
              <xs:element name="NR_STATUS" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REQUISITION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_TYPE" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_NUMBER" type="xs:string" minOccurs="0" />
              <xs:element name="NR_REF_LOCATION" type="xs:string" minOccurs="0" />
              <xs:element name="NR_CREATEDBY_ID" type="xs:int" minOccurs="0" />
              <xs:element name="NR_CREATEDBY_NAME" type="xs:string" minOccurs="0" />
              <xs:element name="NR_LAST_PRINT_URL" type="xs:string" minOccurs="0" />
              <xs:element name="NR_DISCREPANCY" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="NRD_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRD_NR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRD_DISCREPANCY" type="xs:string" minOccurs="0" />
                    <xs:element name="NRD_CORRECTIVE_ACTION" type="xs:string" minOccurs="0" />
                    <xs:element name="NRD_ORDER" type="xs:int" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="NR_PART_REPLACMENT" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="NRPR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRPR_NR_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="NRPR_PN_OFF" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_PN_ON" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_SN_OFF" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_SN_ON" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_TAG" type="xs:string" minOccurs="0" />
                    <xs:element name="NRPR_ORDER" type="xs:int" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="NR_ATTACHMENT" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="FL_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_OWNER_ID" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_OWNER_TYPE" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_FILE_TYPE" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_FILE_NAME" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_ORDER" type="xs:int" minOccurs="0" />
                    <xs:element name="FL_NOTE" type="xs:string" minOccurs="0" />
                    <xs:element name="FL_DATA" type="xs:base64Binary" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1">
      <xs:selector xpath=".//NR_DATA" />
      <xs:field xpath="NR_ID" />
    </xs:unique>
    <xs:keyref name="ATTACHMENTS" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_ATTACHMENT" />
      <xs:field xpath="FL_OWNER_ID" />
    </xs:keyref>
    <xs:keyref name="PARTS" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_PART_REPLACMENT" />
      <xs:field xpath="NRPR_NR_ID" />
    </xs:keyref>
    <xs:keyref name="DISCREPANCY" refer="Constraint1" msdata:IsNested="true">
      <xs:selector xpath=".//NR_DISCREPANCY" />
      <xs:field xpath="NRD_NR_ID" />
    </xs:keyref>
  </xs:element>
</xs:schema>

<NR>
  <NR_DATA>
    <NR_ID>1</NR_ID>
    <NR_PD_ID>1</NR_PD_ID>
    <NR_NRP_ID>1</NR_NRP_ID>
    <NR_WC_ID>16459</NR_WC_ID>
    <NR_WC_NUMBER>24-011-01-03</NR_WC_NUMBER>
    <NR_ATA_CODE>24</NR_ATA_CODE>
    <NR_ATA_SECTION>SYSTEMS AND POWERPLANT</NR_ATA_SECTION>
    <NR_ATA_SUBSECTION />
    <NR_CONTROL_NUMBER>C_1501</NR_CONTROL_NUMBER>
    <NR_TAIL_NUMBER>N2590G</NR_TAIL_NUMBER>
    <NR_SERVICE>CHECK</NR_SERVICE>
    <NR_STATION>IK</NR_STATION>
    <NR_DATE>2006-08-14T04:12:00-04:00</NR_DATE>
    <NR_ZONE>432</NR_ZONE>
    <NR_SKILL>ENGIN</NR_SKILL>
    <NR_ORIG_BY>0</NR_ORIG_BY>
    <NR_INSP_REQUIRED>0</NR_INSP_REQUIRED>
    <NR_APPROVAL_BY />
    <NR_ESTIMATED_MH_INSP>0</NR_ESTIMATED_MH_INSP>
    <NR_ESTIMATED_MH_MECH>0</NR_ESTIMATED_MH_MECH>
    <NR_STATUS>NEW</NR_STATUS>
    <NR_REQUISITION />
    <NR_REF_TYPE />
    <NR_REF_NUMBER />
    <NR_REF_LOCATION />
    <NR_CREATEDBY_ID>17</NR_CREATEDBY_ID>
    <NR_CREATEDBY_NAME>operator</NR_CREATEDBY_NAME>
    <NR_LAST_PRINT_URL>http://</NR_LAST_PRINT_URL>
    <NR_DISCREPANCY>
      <NRD_ID>1</NRD_ID>
      <NRD_NR_ID>1</NRD_NR_ID>
      <NRD_DISCREPANCY>fff</NRD_DISCREPANCY>
      <NRD_CORRECTIVE_ACTION>gg</NRD_CORRECTIVE_ACTION>
      <NRD_ORDER>0</NRD_ORDER>
    </NR_DISCREPANCY>
    <NR_PART_REPLACMENT>
      <NRPR_ID>1</NRPR_ID>
      <NRPR_NR_ID>1</NRPR_NR_ID>
      <NRPR_PN_OFF>1</NRPR_PN_OFF>
      <NRPR_PN_ON>2</NRPR_PN_ON>
      <NRPR_SN_OFF>3</NRPR_SN_OFF>
      <NRPR_SN_ON>4</NRPR_SN_ON>
      <NRPR_TAG>5</NRPR_TAG>
      <NRPR_ORDER>0</NRPR_ORDER>
    </NR_PART_REPLACMENT>
  </NR_DATA>
</NR>
0
ANAT2403
Asked:
ANAT2403
  • 4
  • 3
1 Solution
 
Geert BormansInformation ArchitectCommented:
Hi ANAT2403,

do you physically add the schema to the xml?
should you not just add a reference to the schema

The XML as you sent it is not well-formed
you should only have one root element

if you really want schema and xml in one file, you will need some sort of wrapper element
<wrapper>
<schema>schema goes here</schema>
<nr>xml goes here</nr>
</wrapper>

so I was wondering,
what is not working? The schema inclusion or the XSLT?

Cheers!
0
 
Geert BormansInformation ArchitectCommented:
ANAT2403,

after your schema is included correctly
it is just a matter of adding something like this to the xslt

<xsl:template match="xs:schema">
    <xsl:copy-of select="."/>
</xsl:template>

cheers

Geert
0
 
ANAT2403Author Commented:
Hi Geert,

when I add:

<xsl:template match="xs:schema">
    <xsl:copy-of select="."/>
</xsl:template>

the transformation fails, when i have the xslt open in the design environment (VS2005) it states that prefix xs is not defined.
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
ANAT2403Author Commented:
The Xml i posted should have the <NR> open tag above the  <xs:schema>  tag. that should make it a valid XML.
0
 
Geert BormansInformation ArchitectCommented:
ANAT2403,

here is the new start of your stylesheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="NR">
        <xsl:copy>
            <xsl:copy-of select="xs:schema"/>
            <xsl:apply-templates select="NR_DATA"/>
        </xsl:copy>
    </xsl:template>
    ...

in the stylesheet element I define your xs namespace (the schema one)
and in the template for NR, I now
- specify the selected node for the apply-templates (NR_DATA) in order to exclude the schema
- and I explicitely copy the schema

cheers

Geert
0
 
ANAT2403Author Commented:
Hi Geert,

This works well, thanks again for all your help.

I have 3 question regarding what you did.

1) the sections that are added to the xml now are added with the complete namespace. can this be removed?
   <NR_PART_REPLACMENT xmlns:xs="http://www.w3.org/2001/XMLSchema">

2) the section that is added is added without the whitespace (Enters and Tabs) between the elements can the whitespaces be added or can i set the newlines and tabs manually (\r\n or something of that nature).

3) Is there an easy application to use for creating such transformation files, i downloaded Altova's suite but i am having a hard time getting it to do anything useful.

Thanks again
0
 
Geert BormansInformation ArchitectCommented:
1) removing the spurious namespace nodes is always a bit tricky,
the good thing is that they don't hurt

You could try to remove the xs namespace nod from the stylesheet element and move it to the schema node
something like this
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="NR">
        <xsl:copy>
            <xsl:copy-of select="xs:schema" xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
            <xsl:apply-templates select="NR_DATA"/>
        </xsl:copy>
    </xsl:template>

or have an exclude prefix in the stylesheet element
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  exclude-result-prefixes="xs" ...

2) the toplevel element <xsl:output/> helps you specifying the serialisation

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
     <xsl:output indent="yes"/>
    <xsl:template match="/"> ....
adds some white-space

3) I don't like the graphical stuff too much, but stylus studio xslt designer can do something for you
http://www.stylusstudio.com/xslt_designer.html

I code the XSLT myself using either
www.oxygenxml.com or www.stylusstudio.com

cheers

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now