Jon Mason
Jon Mason

Reputation: 23

xml with dash/hyphen in element in xsl select

I'm getting 0 results from my select in my xsl xml read. I suspect it's the dash/hyphen in the element path.

XML:

<sa-rest xmlns="http://iemfsa.tivoli.ibm.com/REST" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <status-set state="expired" action-name="Test Plan" />
</sa-rest>

XSL:

<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
 <xsl:output method="html" encoding="UTF-8" indent="yes"/>  
  <xsl:template match="/">  
   <html>  
   <link rel="stylesheet" href="w3.css" />
    <head>  
    </head>  
    <body>  
    <table>
    <tr><th>Name</th><th>State</th></tr>
    <tr>
     <td><xsl:copy-of select="/sa-rest/status-set/@action-name"/></td>
     <td><xsl:copy-of select="/sa-rest/status-set/@state"/></td>
     </tr>
     </table> 
    </body>  
   </html>  
  </xsl:template>  
</xsl:stylesheet>  

but the results I get are:

<html>
<link rel="stylesheet" href="w3.css">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><table>
<tr>
<th>Name</th>
<th>State</th>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table></body>
</html>

Where am I going wrong?

Upvotes: 1

Views: 1848

Answers (2)

JohnLBevan
JohnLBevan

Reputation: 24430

1) You're copying the attribute itself rather than getting its value.

<xsl:copy-of select="/sa-rest/status-set/@action-name"/> should be <xsl:value-of select="/sa-rest/status-set/@action-name"/

2) You're accessing the element names without saying which namespace they're in. Add a reference to the namespace in the stylesheet element (e.g. xmlns:rest="http://iemfsa.tivoli.ibm.com/REST"), then prefix any element names from that NS with this (e.g. /sa-rest/status-set/@action-name becomes /rest:sa-rest/rest:status-set/@action-name).

3) This one's optional. I prefer to always operate within a context; so rather than matching / in my template, I match /* (i.e. the root element itself), then in my select statements I access other elements relative to that context (e.g. replace /rest:sa-rest/rest:status-set/@action-name with ./rest:status-set/@action-name).

<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rest="http://iemfsa.tivoli.ibm.com/REST">  
 <xsl:output method="html" encoding="UTF-8" indent="yes"/>  
  <xsl:template match="/*">  
   <html>  
   <link rel="stylesheet" href="w3.css" />
	<head>  
	</head>  
	<body>  
	<table>
	<tr><th>Name</th><th>State</th></tr>
	<tr>
	 <td><xsl:value-of select="./rest:status-set/@action-name"/></td>
	 <td><xsl:value-of select="./rest:status-set/@state"/></td>
	 </tr>
	 </table> 
	</body>  
   </html>  
  </xsl:template>  
</xsl:stylesheet>  

Side Note

If you have an assumption about an issue, try testing that assumption. i.e. you thought the issue was caused by the hyphens; did you try changing your XML and XSLT to remove the hyphens from the element names and test without (e.g. status-set -> statusset)? That would prove or disprove that theory, ensuring you focus your investigation in the right place / don't spend long working based on false assumptions.

Hope that helps.

Upvotes: 2

Stefan Hegny
Stefan Hegny

Reputation: 2187

Try declaring the xmlns="http://iemfsa.tivoli.ibm.com/REST" namespace in the xsl. Or specify a prefix for it xmlns:tivoli="http... and the use tivoli:sa-rest/tivoli:status-set etc...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:tivoli="http://iemfsa.tivoli.ibm.com/REST"
 exclude-result-prefixes="tivoli>  
 <xsl:output method="html" encoding="UTF
....
    <tr>
     <td><xsl:copy-of select="/tivoli:sa-rest/tivoli:status-set/@action-name"/></td>
     <td><xsl:copy-of select="/tivoli:sa-rest/tivoli:status-set/@state"/></td>
     </tr>

Upvotes: 0

Related Questions