[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] sorting and multiple output documents in xslt 2.0


Subject: Re: [xsl] sorting and multiple output documents in xslt 2.0
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Fri, 29 Jul 2011 19:45:45 +0100

The logic you need is something like this:

<xsl:template match="xml">
<xsl:result-document href="doctoral">
<xsl:apply-templates select="DISS_submission[is-doctoral()]"/>
</xsl:result-document>
<xsl:result-document href="masters">
<xsl:apply-templates select="DISS_submission[is-masters()]"/>
</xsl:result-document>
</xsl:template>

where is-doctoral() and is-masters() are whatever predicates you need to select a doctoral thesis or a masters' thesis, and the apply-templates does whatever processing is needed to extract the data you want to copy into the result document.

Michael Kay
Saxonica



On 29/07/2011 19:37, Meghan Finch wrote:
Hello Michael (and others),

I'm sorry for not better explaining. The xml element does exist,
though I did not include it in the example I provided. That is the
first element that houses all other elements. While it may not be the
best choice for an element, I am working with xml that is created by
another company, so I cannot control how they have designed their
schema. I am only trying to transform it to work with my local system.

There are several DISS_submission'ss all contained in one file, housed
within the element called xml. I am trying to sort each of those
DISS_submission's into two different output documents, depending on
whether their DISS_description@type attribute is either "masters" or
"doctoral." So while the example I provided has a type of "doctoral,"
there are other DISS_submission/DISS_description elements that have a
type attribute of "masters."

I hope that provided better clarification. So I am looking to sort
each DISS_submission with all child elements into 2 outputs depending
on what the DISS_description@type attribute value is, with several
DISS_submission 's all contained within one document.

Thanks again.

--Meghan



On Fri, Jul 29, 2011 at 2:18 PM, Michael Kay<mike@xxxxxxxxxxxx> wrote:
On 29/07/2011 18:43, Meghan Finch wrote:
Hello,

I am new to the listserv and was hoping that I could find some help. I
am working on a transformation that will take xml that describes
theses and dissertations and produce two different xml outputs, one
with all of the theses and the other with all of the dissertations.
This is an example of a single thesis/dissertation xml record:
Your template rule says

<xsl:template match="xml">

but I don't see an element named "xml". (It would be a poor choice of
element name anyway, but that's by the by.

I would also point out that this:

<xsl:if test="DISS_submission/DISS_description[@type='masters']">
           <xsl:copy-of
select="DISS_submission/DISS_description[@type='masters']"/>
       </xsl:if>

is equivalent to this:

<xsl:copy-of
select="DISS_submission/DISS_description[@type='masters']"/>

since if there's nothing to copy, then nothing gets copied.


Beyond that, I'm just confused. Is there more than one DISS_submission element perhaps? Are you trying to produce one result document for several DISS_submission elements, or one for each?

Michael Kay
Saxonica

<?xml version="1.0" encoding="UTF-8"?>
<DISS_submission publishing_option="0" embargo_code="0"
third_party_search="Y" third_party_sales="N">
    <DISS_authorship>
        <DISS_author type="primary">
            <DISS_name>
                <DISS_surname></DISS_surname>
                <DISS_fname></DISS_fname>
                <DISS_middle/>
                <DISS_suffix/>
                <DISS_affiliation></DISS_affiliation>
            </DISS_name>
            <DISS_contact type="current">
                <DISS_contact_effdt></DISS_contact_effdt>
                <DISS_address>
                    <DISS_addrline></DISS_addrline>
                    <DISS_addrline></DISS_addrline>
                    <DISS_city></DISS_city>
                    <DISS_st></DISS_st>
                    <DISS_pcode></DISS_pcode>
                    <DISS_country></DISS_country>
                </DISS_address>
                <DISS_email></DISS_email>
            </DISS_contact>
            <DISS_contact type="future">
                <DISS_contact_effdt></DISS_contact_effdt>
                <DISS_address>
                    <DISS_addrline></DISS_addrline>
                    <DISS_addrline></DISS_addrline>
                    <DISS_city></DISS_city>
                    <DISS_st></DISS_st>
                    <DISS_pcode></DISS_pcode>
                    <DISS_country></DISS_country>
                </DISS_address>
                <DISS_email></DISS_email>
            </DISS_contact>
            <DISS_citizenship></DISS_citizenship>
        </DISS_author>
    </DISS_authorship>
    <DISS_description page_count="115" type="doctoral"
external_id="http://id.pdf" apply_for_copyright="no">
        <DISS_title></DISS_title>
        <DISS_dates>
            <DISS_comp_date></DISS_comp_date>
            <DISS_accept_date></DISS_accept_date>
        </DISS_dates>
        <DISS_degree></DISS_degree>
        <DISS_institution>
            <DISS_inst_code></DISS_inst_code>
            <DISS_inst_name></DISS_inst_name>
            <DISS_inst_contact></DISS_inst_contact>
            <DISS_processing_code></DISS_processing_code>
        </DISS_institution>
        <DISS_advisor>
            <DISS_name>
                <DISS_surname></DISS_surname>
                <DISS_fname></DISS_fname>
                <DISS_middle></DISS_middle>
            </DISS_name>
        </DISS_advisor>
        <DISS_cmte_member>
            <DISS_name>
                <DISS_surname></DISS_surname>
                <DISS_fname></DISS_fname>
                <DISS_middle/>
                <DISS_suffix/>
                <DISS_affiliation/>
            </DISS_name>
        </DISS_cmte_member>
        <DISS_cmte_member>
            <DISS_name>
                <DISS_surname></DISS_surname>
                <DISS_fname></DISS_fname>
                <DISS_middle/>
                <DISS_suffix/>
                <DISS_affiliation/>
            </DISS_name>
        </DISS_cmte_member>
        <DISS_cmte_member>
            <DISS_name>
                <DISS_surname></DISS_surname>
                <DISS_fname></DISS_fname>
                <DISS_middle/>
                <DISS_suffix/>
                <DISS_affiliation/>
            </DISS_name>
        </DISS_cmte_member>
        <DISS_categorization>
            <DISS_category>
                <DISS_cat_code></DISS_cat_code>
                <DISS_cat_desc></DISS_cat_desc>
            </DISS_category>
            <DISS_keyword/>
            <DISS_language></DISS_language>
        </DISS_categorization>
    </DISS_description>
    <DISS_content>
        <DISS_abstract>
            <DISS_para></DISS_para>
        </DISS_abstract>
        <DISS_binary type="PDF"></DISS_binary>
    </DISS_content>
    <DISS_restriction/>
</DISS_submission>

There are 3 elements inside DISS_submission that are important:
DISS_authorship, DISS_description, and DISS_content. Here is the xsl
that Ive been trying so far:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" indent="yes"/>

<xsl:template match="xml">
    <xsl:result-document href="masters.xml">

        <xsl:if test="DISS_submission/DISS_description[@type='masters']">
            <xsl:copy-of
select="DISS_submission/DISS_description[@type='masters']"/>
        </xsl:if>

    </xsl:result-document>
    <xsl:result-document href="doctoral.xml">

        <xsl:if test="DISS_submission/DISS_description[@type='doctoral']">
         <xsl:copy-of
select="DISS_submission/DISS_description[@type='doctoral']"/>
        </xsl:if>

    </xsl:result-document>
    </xsl:template></xsl:stylesheet>

This does actually create two outputs, one for masters and one for
theses. However, it only copies the DISS_description element and its
children. I want the entire DISS_submission to be copied. Ive tried
replacing xsl:copy-of to just DISS_submission but that just creates
two new documents with all of the DISS_submission s, not a sort
between masters and doctoral.

Im fairly new to xsl and not really a programmer, so forgive me
please for any obvious oversights here. XPATH also tends to give me a
lot of difficulty, so it could be something simple in there to fix.
I'm using Saxon to complete the transform. Thank you for the help and
feedback.

--Meghan Finch


Current Thread
Keywords