Skip to main content
2 of 3
edited tags; edited title
PolyGeo
  • 65.4k
  • 29
  • 114
  • 345

Using HTML Popup to show multiple image attachments in ArcMap?

I got a lot of image attached to a feature, like a road. I use the HTML popup to show these images. However, the default setting can only show 1 of those images, so I tried to customize it with a .xsl file. I don't know much about XSL, so I did some changes to the default template like this:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:variable name="ignoreFieldNames" select="'|OBJECTID|Shape|Shape_Length|Shape_Area|ATTACHMENTID|REL_OBJECTID|CONTENT_TYPE|ATT_NAME|DATA_SIZE|DATA|'"/>
<xsl:variable name="headerRowColor" select="'#9CBCE2'"/>
<xsl:variable name="alternateRowColor" select="'#D4E4F3'"/>
<xsl:template match="/">
    <html>
        <head>
            <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        </head>
        <body style="margin:0px 0px 0px 0px;overflow:auto;background:#FFFFFF;">
            <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-collapse:collapse;padding:3px 3px 3px 3px">
                <tr style="text-align:center;font-weight:bold;background:{$headerRowColor}">
                    <td>
                        <xsl:value-of select="FieldsDoc/Title" />
                    </td>
                </tr>
                <xsl:apply-templates select="FieldsDoc/Attachments" />
                <tr>
                    <td>
                        <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">
                            <xsl:choose>
                                <xsl:when test="FieldsDoc/Fields/Field/FieldName">
                                    <xsl:apply-templates select="FieldsDoc/Fields/Field/FieldName[not(contains($ignoreFieldNames, concat(concat('|', text()), '|')))]/.." />
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:apply-templates select="FieldsDoc/Fields/Field" />
                                </xsl:otherwise>
                            </xsl:choose>
                        </table>
                    </td>
                </tr>
            </table>
        </body>
    </html>
</xsl:template>

<xsl:template match="Attachments">
    <xsl:variable name="imageCount" select="count(Attachment/ContentType[contains(., 'image')])"/>
    <xsl:variable name="attachmentCount" select="count(Attachment)"/>
    <tr bgcolor="{$headerRowColor}">
        <td>
            <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">
                <xsl:variable name="imageSrc" select="Attachment/ContentType[contains(., 'image')]/../FilePath"/>
                <xsl:if test="$imageSrc">
                    <tr align="center">
                        <td>
                            <a target="_blank" href="{$imageSrc}">
                                <img src="{$imageSrc}" width="275px" border="0"/>
                            </a>
                        </td>
                    </tr>
                    <tr align="center">
                        <td>
                            <xsl:value-of select="Attachment/ContentType[contains(., 'image')]/../Name" />
                        </td>
                    </tr>
                </xsl:if>
                <xsl:if test="($attachmentCount &gt; $imageCount) or not($imageCount = 1)">
                    <tr align="center">
                        <td>
                            <table style="font-family:Arial,Verdana,Times;font-size:12px;text-align:left;width:100%;border-spacing:0px; padding:3px 3px 3px 3px">
                                <xsl:for-each select="Attachment[position() mod 2 = 1]">
                                    <tr align="left" bgcolor="white">
                                        <xsl:if test="(position() +1) mod 2">
                                            <xsl:attribute name="bgcolor">
                                                <xsl:value-of select="$alternateRowColor"/>
                                            </xsl:attribute>
                                        </xsl:if>
                                        <xsl:variable name="imageSrcNext" select="following-sibling::Attachment/ContentType[contains(., 'image')]/../FilePath"/>
                                        
                                        <tr align="center">
                                            <td>
                                                    <a target="_blank" href="{$imageSrcNext}">
                                                        <img src="{$imageSrcNext}" width="275px" border="0"/>
                                                    </a>
                                            </td>
                                        </tr>
                                                <tr align="center">
                                                    <td>
                                                        <xsl:value-of select="following-sibling::Attachment/Name" />
                                                    </td>
                                                </tr>
                                                </tr>
                                </xsl:for-each>
                            </table>
                        </td>
                    </tr>
                </xsl:if>
            </table>
        </td>
    </tr>
</xsl:template>

<xsl:template match="Field">
    <tr>
        <xsl:if test="(position() +1) mod 2">
            <xsl:attribute name="bgcolor">
                <xsl:value-of select="$alternateRowColor"/>
            </xsl:attribute>
        </xsl:if>
        <xsl:if test="FieldName">
            <td>
                <xsl:value-of select="FieldName"/>
            </td>
        </xsl:if>
        <td>
            <xsl:choose>
                <xsl:when test="FieldValue[starts-with(., 'www.')]">
                    <a target="_blank">
                        <xsl:attribute name="href">http://<xsl:value-of select="FieldValue"/>
                        </xsl:attribute>
                        <xsl:value-of select="FieldValue"/>
                    </a>
                </xsl:when>
                <xsl:when test="FieldValue[starts-with(., 'http:')]">
                    <a target="_blank">
                        <xsl:attribute name="href">
                            <xsl:value-of select="FieldValue"/>
                        </xsl:attribute>
                        <xsl:value-of select="FieldValue"/>
                    </a>
                </xsl:when>
                <xsl:when test="FieldValue[starts-with(., 'https:')]">
                    <a target="_blank">
                        <xsl:attribute name="href">
                            <xsl:value-of select="FieldValue"/>
                        </xsl:attribute>
                        <xsl:value-of select="FieldValue"/>
                    </a>
                </xsl:when>
                <xsl:when test="FieldValue[starts-with(., '\\')]">
                    <a target="_blank">
                        <xsl:attribute name="href">
                            <xsl:value-of select="FieldValue"/>
                        </xsl:attribute>
                        <xsl:value-of select="FieldValue"/>
                    </a>
                </xsl:when>
                <xsl:when test="FieldValue[starts-with(., '&lt;img ')]">
                    <xsl:value-of select="FieldValue" disable-output-escaping="yes" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="FieldValue"/>
                </xsl:otherwise>
            </xsl:choose>
        </td>
    </tr>
</xsl:template>

</xsl:stylesheet>

I changed the attachment part a bit, mainaly in here:

   <xsl:for-each select="Attachment[position() mod 2 = 1]">
                                <tr align="left" bgcolor="white">
                                    <xsl:if test="(position() +1) mod 2">
                                        <xsl:attribute name="bgcolor">
                                            <xsl:value-of select="$alternateRowColor"/>
                                        </xsl:attribute>
                                    </xsl:if>
                                    <xsl:variable name="imageSrcNext" select="following-sibling::Attachment/ContentType[contains(., 'image')]/../FilePath"/>

                                    <tr align="center">
                                        <td>
                                                <a target="_blank" href="{$imageSrcNext}">
                                                    <img src="{$imageSrcNext}" width="275px" border="0"/>
                                                </a>
                                        </td>
                                    </tr>
                                            <tr align="center">
                                                <td>
                                                    <xsl:value-of select="following-sibling::Attachment/Name" />
                                                </td>
                                            </tr>
                                            </tr>
                            </xsl:for-each>

After I imported the template, the result was like this:enter image description here

If you click on the image, it can be displayed properly in a new window. But why it can't be displayed properly in the popup?

John_Doe
  • 53
  • 1
  • 8