Karthick
Karthick

Reputation: 33

How to transform all same element in a node

In below xml file contain many author elements. I have mentioned in xslt and display the first element only. I want to show all author elements. Kindly provide the xslt coding for element not in the text will be shown in browser.

XML Code:

<?xml version="1.0" encoding="US-ASCII" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="view.xsl"?>
<!DOCTYPE WileyML3G [
<!ENTITY % wileyml3g.ent SYSTEM "http://v.wiley.com:3535/dtds/wileyml3g/wiley.ent">
%wileyml3g.ent;
]>
<bibliography xml:id="aic16349-bibl-0001" style="numbered" cited="no">
<title type="main">REFERENCE<!--<QUERY xml:id="Q2"><p>References "3&#x2013;35" were not cited anywhere in the text. Please provide a citation. Alternatively, delete the items from the list.</p></QUERY>--></title>
<bib xml:id="aic16349-bib-0001">
<citation type="journal" xml:id="aic16349-cit-0001"><!--<QUERY xml:id="Q3"><p>Reference "1"  is not cited in the text. Please indicate where it should be cited; or delete from the reference list.</p></QUERY>-->
<author><familyName>Deer</familyName> <givenNames>TR</givenNames></author>, <author><familyName>Provenzano</familyName> <givenNames>DA</givenNames></author>, <author><familyName>Hanes</familyName> <givenNames>M</givenNames></author>, et al. <articleTitle>The Neurostimulation Appropriateness Consensus Committee (NACC) Recommendations for Infection Prevention and Management</articleTitle>. <journalTitle>Neuromodulation.</journalTitle> <pubYear year="2017">2017</pubYear>;<vol>20</vol>(<issue>1</issue>):<pageFirst>31</pageFirst>&#x2010;<pageLast>50</pageLast>.</citation>
</bib>

XSLT Code:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>HTML VIEW</h1>
<table border="1" cellpadding="10px">
<tr>
<th>Authors</th>
<th>Year</th>
<th>Article_Title</th>
<th>Journal_Title</th>
<th>Volume</th>
<th>Issue</th>
<th>First_Page</th>
<th>Last_Page</th>
</tr>
<xsl:for-each select="bibliography/bib/citation">
<tr>
<td><span style="background-color:skyblue;"><xsl:value-of select="author"/></span>, </td>
<td><xsl:value-of select="pubYear"/></td>
<td width="75%"><xsl:value-of select="articleTitle"/></td>
<td width="25%"><xsl:value-of select="journalTitle"/></td>
<td><xsl:value-of select="vol"/></td>
<td><xsl:value-of select="issue"/></td>
<td><xsl:value-of select="pageFirst"/></td>
<td><xsl:value-of select="pageLast"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Upvotes: 0

Views: 71

Answers (2)

Amrendra Kumar
Amrendra Kumar

Reputation: 1816

As @Martin suggestion if you really want to use 1.0 then you have to go with for-each author like:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h1>HTML VIEW</h1>
                <table border="1" cellpadding="10px">
                    <tr>
                        <th>Authors</th>
                        <th>Year</th>
                        <th>Article_Title</th>
                        <th>Journal_Title</th>
                        <th>Volume</th>
                        <th>Issue</th>
                        <th>First_Page</th>
                        <th>Last_Page</th>
                    </tr>
                    <xsl:for-each select="bibliography/bib/citation">
                        <tr>
                            <td>
                                <span style="background-color:skyblue;">
                                    <xsl:for-each select="author">
                                        <xsl:value-of select="."/>
                                        <xsl:if test="following-sibling::author"><xsl:text>, </xsl:text></xsl:if>
                                    </xsl:for-each>
                                </span>
                            </td>
                            <td><xsl:value-of select="pubYear"/></td>
                            <td width="75%"><xsl:value-of select="articleTitle"/></td>
                            <td width="25%"><xsl:value-of select="journalTitle"/></td>
                            <td><xsl:value-of select="vol"/></td>
                            <td><xsl:value-of select="issue"/></td>
                            <td><xsl:value-of select="pageFirst"/></td>
                            <td><xsl:value-of select="pageLast"/></td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Or it will be done very easy while working with 2.0 like:

  1. Need to change the XSLT version from 1.0 to 2.0
  2. Use @seperator with , in value-of author.

    HTML VIEW

    Authors Year Article_Title Journal_Title Volume Issue First_Page Last_Page

Upvotes: 0

Martin Honnen
Martin Honnen

Reputation: 167401

You have tagged the question as XSLT 2.0 and if you really use an XSLT 2.0 processor and use version="2.0" in your stylesheet then <xsl:value-of select="author"/> would output all selected author child elements and you could even use <xsl:value-of select="author" separator=", "/> to have the different authors separated by ,. If you use XSLT 1.0 then use <xsl:appy-templates select="author"/> and <xsl:template match="author"><xsl:if test="position() > 1">, </xsl:if></xsl:value-of select="."/></xsl:template> or use xsl:for-each if you prefer that.

Upvotes: 1

Related Questions