CanOfBees
CanOfBees

Reputation: 93

xsl:apply-templates with an in-element replacement

many thanks for any suggestions you can provide. I am working to convert a portion of an XML document to a list. I have the bulk of the transformation working; however, I'm getting hung up on a <emph> child element. I would like to replace it with a " (quote), but I haven't been able to work out the replacement strategy.

Cheers! XML:

<ead>
<archdesc>
    <dsc>
        <head>Container List</head>
        <c01 id="ref1251" level="file">
            <did>
                <unittitle>#464: Dutch. <emph render="doublequote">I know Mary [Frances <emph
                            render="doublequote">Dutchess</emph> (Watrous) Roth] packed it some
                        where!</emph>,</unittitle>
                <container id="cid4822615" type="Box" label="Mixed Materials">2</container>
                <container parent="cid4822615" type="Folder">110</container>
                <unitdate>undated</unitdate>
                <physdesc id="ref1252" label="General Physical Description note"
                    >(Negative)</physdesc>
            </did>
        </c01>
        <c01 id="ref1331" level="file">
            <did>
                <unittitle>#476: Mountain home near Cosby,</unittitle>
                <container id="cid4822586" type="Box" label="Mixed Materials">2</container>
                <container parent="cid4822586" type="Folder">139</container>
                <unitdate>undated</unitdate>
                <physdesc id="ref1332" label="General Physical Description note">(6 of
                    6)</physdesc>
                <physdesc id="ref1333" label="General Physical Description note"
                    >(Print)</physdesc>
            </did>
        </c01>
    </dsc>
</archdesc>
</ead>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>


<xsl:template match="/">
    <xsl:apply-templates select="ead/archdesc/dsc"/>
</xsl:template>

<xsl:template match="dsc">
    <xsl:apply-templates select="c01/did"/>
</xsl:template>

<xsl:template match="did">
    <xsl:apply-templates select="unittitle"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:text>Box: </xsl:text><xsl:apply-templates select="container[1]"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:text>Folder: </xsl:text><xsl:apply-templates select="container[2]"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:apply-templates select="unitdate"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:apply-templates select="physdesc"/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

Upvotes: 0

Views: 207

Answers (1)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243459

Here is an example how this can be done (both in XSLT 2.0 and in XSLT 1.0):

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="emph[@render eq 'doublequote']">
     <xsl:text>"</xsl:text>
     <xsl:apply-templates/>
     <xsl:text>"</xsl:text>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the following short XML document (excerpt from the provided one):

<unittitle>#464: Dutch. 
    <emph render="doublequote">I know Mary [Frances 
        <emph render="doublequote">Dutchess</emph> (Watrous) Roth] packed it some
                        where!</emph>,
</unittitle>

the wanted, correct result is produced:

#464: Dutch. 
    "I know Mary [Frances 
        "Dutchess" (Watrous) Roth] packed it some
                        where!",

Upvotes: 1

Related Questions