Jump to content
View in the app

A better way to browse. Learn more.

FMForums.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

xml import from inconsistent amount of elements

Featured Replies

[Edit: added xslt example]

Hi all,

Given I have an xml like this:

 

<row1>

   <node1>text1</node1>

   <node2>text2</node2>

   <node3>text3</node3>

</row1>

<row2>

   <node1>text4</node1>

   <node3>text5</node3>

</row2>

 

Where node1..n are matched to fields 1..n accordingly, how do I force the xml-import to create an empty field2 at second row instead of putting the value of node3 into it?

 

I have tried constructs like this:

<xsl:choose>
  <xsl:when test="(/results/issues/issue/coverDate) or (not(/results/issues/issue/coverDate))">
     <xsl:for-each select="coverDate"> 
        <COL>
           <DATA>
              <xsl:value-of select="."/>
           </DATA>
        </COL>
      </xsl:for-each>
   </xsl:when>
   <xsl:when test="not(/results/issues/issue/coverDate)">
       <COL>
           <DATA>
           </DATA>
       </COL>
   </xsl:when>
</xsl:choose>
 
But this doesn't seem to work. At least it didn't throw any errors but a nonexistent 'coverDate' will drag the data from the next xml element into the 'coverDate' Field in FM.

 

TiA,

 

demski

I am afraid this is impossible to follow.

results/issues/issue/coverDate

does not match a structure of:

<row1>
   <node1>text1</node1>
   <node2>text2</node2>
   ...

I suggest you post a complete example of your XML input, along with the entire stylesheet you have so far.

  • Author

Thanks for your response!

Yeah, of course, you are right. I mixed exemplary with real world stuff.

Let me formulate it again as the xml I am working on contains customer data I am not supposed to show...

 

When importing an xml similar to the example below I receive a second record in FM that shows "text5" in field2 and an empty field3 instead of empty field2 and "text5" in field3.

I hope this was better asked? 

 

the xml should be:

<?xml version="1.0"?>
<rows>
    <row>
        <node1>text1</node1>
        <node2>text2</node2>
        <node3>text3</node3>
    </row>
    <row>
        <node1>text4</node1>
        <node3>text5</node3>
    </row>
</rows>

 

whereas the xslt would look like

 

 

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    <xsl:template match="/*">
        <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
            <ERRORCODE>0</ERRORCODE>
            <PRODUCT BUILD="11/1/03" NAME="" VERSION=""/>
            <DATABASE DATEFORMAT="M/d/yyyy" LAYOUT="" NAME="" RECORDS="{count(/*/row)}" TIMEFORMAT="h:mm:ss a"/>
            <METADATA>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field1" TYPE="TEXT"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field2" TYPE="TEXT"/>
                <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field3" TYPE="TEXT"/>
            </METADATA>
            <RESULTSET>
                <xsl:attribute name="FOUND">
                    <xsl:value-of select="count(/*/row)"/>
                </xsl:attribute>
                <xsl:for-each select="/*/row">
                    <ROW>
                        <xsl:for-each select="node1">
                            <COL>
                                <DATA>
                                    <xsl:value-of select="."/>
                                </DATA>
                            </COL>
                        </xsl:for-each>
                        <xsl:for-each select="node2">
                            <COL>
                                <DATA>
                                    <xsl:value-of select="."/>
                                </DATA>
                            </COL>
                        </xsl:for-each>
                        <xsl:for-each select="node3">
                            <COL>
                                <DATA>
                                    <xsl:value-of select="."/>
                                </DATA>
                            </COL>
                        </xsl:for-each>
                    </ROW>
                </xsl:for-each>
            </RESULTSET>
        </FMPXMLRESULT>
    </xsl:template>
</xsl:stylesheet>

Okay, this is just because you are making this more complicated than it needs to be. Try it this way:

<?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="" VERSION=""/>
<DATABASE DATEFORMAT="" LAYOUT="" NAME="" RECORDS="" TIMEFORMAT=""/>

<METADATA>
    <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field1" TYPE="TEXT"/>
    <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field2" TYPE="TEXT"/>
    <FIELD EMPTYOK="YES" MAXREPEAT="1" NAME="field3" TYPE="TEXT"/>
</METADATA>

<RESULTSET FOUND="">

<xsl:for-each select="rows/row">
<ROW MODID="" RECORDID="">
    <COL><DATA><xsl:value-of select="node1"/></DATA></COL>
    <COL><DATA><xsl:value-of select="node2"/></DATA></COL>
    <COL><DATA><xsl:value-of select="node3"/></DATA></COL>
</ROW>
</xsl:for-each>

</RESULTSET>
</FMPXMLRESULT>
</xsl:template>
</xsl:stylesheet>
  • Author

Thanks a lot! I will give it a try on my full example and see what this will return then!

BTW: is

 

 

<RESULTSET FOUND="">

really enough or does it have to contain the count of elements? I thought that one was mandatory!

It's enough. There's nothing missing from the stylesheet I posted - you can try and use it to import your sample data and see that it works. All the "missing" attributes are ignored during the import.

  • Author

Great! Thank you for your highly appreciated input on a sunny sunday!

  • Author

Dear comment!

 

I have implemented your example to my real world example and it works like a charm.

You made my day!

 

cheers,

demski

Create an account or sign in to comment

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.