CCBtx Posted April 7, 2014 Posted April 7, 2014 Can someone help me with the following: I want to extract <loc>, <lastmod> and <priority> from this xml: <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url><loc>http://www.myurl.com/</loc><lastmod>2014-04-03T15:51:51-05:00</lastmod><priority>1.0</priority></url> <url><loc>http://www.myurl.com/for-sale/TX/100/79109/173-Main-094451242</loc><lastmod>2014-04-07T03:09:00-05:00</lastmod><priority>0.7</priority></url> <url><loc>http://www.myurl.com/for-sale/TX/100/79109/146-Main-098844556</loc><lastmod>2014-04-07T02:48:00-05:00</lastmod><priority>0.7</priority></url> <url><loc>http://www.myurl.com/for-sale/TX/100/79109/353-Main-188745469</loc><lastmod>2014-04-07T02:31:00-05:00</lastmod><priority>0.7</priority></url> </urlset> I am using this stylesheet (which is not working): <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <ERRORCODE>0</ERRORCODE> <PRODUCT BUILD="" NAME="FileMaker" VERSION="ProAdvanced 12.0v4"/> <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/> <METADATA> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="loc" TYPE="TEXT" /> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lastmod" TYPE="TEXT" /> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="priority" TYPE="TEXT" /> </METADATA> <RESULTSET FOUND=""> <xsl:for-each select="//url"> <ROW RECORDID="" MODID="" > <COL><DATA><xsl:value-of select="loc"/></DATA></COL> <COL><DATA><xsl:value-of select="lastmod"/></DATA></COL> <COL><DATA><xsl:value-of select="priority"/></DATA></COL> </ROW> </xsl:for-each> </RESULTSET> </FMPXMLRESULT> </xsl:template> </xsl:stylesheet> Thanks very much.
comment Posted April 7, 2014 Posted April 7, 2014 First thing: please use the "code" formatting when posting XML code, to make it readable: <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.myurl.com/</loc> <lastmod>2014-04-03T15:51:51-05:00</lastmod> <priority>1.0</priority> </url> <url> <loc>http://www.myurl.com/for-sale/TX/100/79109/173-Main-094451242</loc> <lastmod>2014-04-07T03:09:00-05:00</lastmod> <priority>0.7</priority> </url> <url> <loc>http://www.myurl.com/for-sale/TX/100/79109/146-Main-098844556</loc> <lastmod>2014-04-07T02:48:00-05:00</lastmod> <priority>0.7</priority> </url> <url> <loc>http://www.myurl.com/for-sale/TX/100/79109/353-Main-188745469</loc> <lastmod>2014-04-07T02:31:00-05:00</lastmod> <priority>0.7</priority> </url> </urlset> Now, the reason why your stylesheet cannot work is that the source XML has a namespace of its own, declared in the root element: xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" All the elements descendant of the root element inherit this namespace. As a result, all your XPath expressions: select="//url" select="loc" etc. select nothing. You need to declare the namespace in your stylesheet, assign it a prefix, and use that prefix when calling the elements in your XML: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:smp="http://www.sitemaps.org/schemas/sitemap/0.9"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult"> <ERRORCODE>0</ERRORCODE> <PRODUCT BUILD="" NAME="FileMaker" VERSION="ProAdvanced 12.0v4"/> <DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/> <METADATA> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="loc" TYPE="TEXT" /> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="lastmod" TYPE="TEXT" /> <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="priority" TYPE="TEXT" /> </METADATA> <RESULTSET FOUND=""> <xsl:for-each select="//smp:url"> <ROW RECORDID="" MODID="" > <COL><DATA><xsl:value-of select="smp:loc"/></DATA></COL> <COL><DATA><xsl:value-of select="smp:lastmod"/></DATA></COL> <COL><DATA><xsl:value-of select="smp:priority"/></DATA></COL> </ROW> </xsl:for-each> </RESULTSET> </FMPXMLRESULT> </xsl:template> </xsl:stylesheet> Note also that performance-wise, it pays to be explicit in XSLT. It's better to say: <xsl:for-each select="smp:urlset/smp:url"> than just: <xsl:for-each select="//smp:url">
CCBtx Posted April 8, 2014 Author Posted April 8, 2014 Excellent. Thank you so much, Comment. As usual... works like a charm.
beverly Posted April 25, 2014 Posted April 25, 2014 Glad it worked! I'd change comment's excellent code like this (two snippets): 1. if you use/create an xmlns for the source, then remember to exclude it from the output. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:smp="http://www.sitemaps.org/schemas/sitemap/0.9" exclude-result-prefixes="smp"> 2. if you have 'relative' path for the child elements, the parent xmlns is only required. <RESULTSET FOUND=""> <xsl:for-each select="//smp:url"> <ROW RECORDID="" MODID="" > <COL><DATA><xsl:value-of select="./loc"/></DATA></COL> <COL><DATA><xsl:value-of select="./lastmod"/></DATA></COL> <COL><DATA><xsl:value-of select="./priority"/></DATA></COL> </ROW> </xsl:for-each>
comment Posted April 25, 2014 Posted April 25, 2014 On 4/25/2014 at 5:02 PM, beverly said: 1. if you use/create an xmlns for the source, then remember to exclude it from the output. 2. if you have 'relative' path for the child elements, the parent xmlns is only required. Re #1, it makes no practical difference, but perhaps as a point of good practice... Alas, you could not be more wrong re #2. So who are you and what have you done to the real Beverly Voth, the author of FileMaker Pro 6 Developer's Guide to XML/XSL - who BTW would also not write "./loc" when "loc" is quite sufficient?
beverly Posted April 25, 2014 Posted April 25, 2014 LOL! 'as a point of good practice' for both 1 & 2 ? mostly tried-and-true with what works well in FMP since v6 and still works well in v13!!
Recommended Posts
This topic is 3997 days old. Please don't post here. Open a new topic instead.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now