开发者

XSL conditional formatting

开发者 https://www.devze.com 2023-02-22 19:45 出处:网络
I am using xsl to transform xml to kml format. I would like to add conditional logic to the xsl to switch the styleUrl based on part of an attribute value. The attribute name is FROM_SYSTEM_ID. The fo

I am using xsl to transform xml to kml format. I would like to add conditional logic to the xsl to switch the styleUrl based on part of an attribute value. The attribute name is FROM_SYSTEM_ID. The format of the attribute value is "A-123-CAM-1" where "CAM" is part of the string to determine which style definition to use (in this case CAM stands for Camera, CAB stands for Cabinet, etc).

How can I parse this attribute to perform the needed style definition switch?

Following is my xsl template:

<xsl:template match="Line">
    <Folder>
      <name>
        Lines
        <!--<xsl:value-of select="@name"/>-->
      </name>
      <xsl:for-each select="Row">
        <Placemark>
          <name>
            <xsl:value-of select="@FROM_SYSTEM_ID"/>
          </name>
          <description>
            <xsl:value-of select="@TO_SYSTEM_ID"/>
          </description>
          <styleUrl>#msn_open-diamond00</styleUrl>
          <LineString>
            <tessellate>1</tessellate>
            <coordinates>
              <xsl:value-of select="@FromLong"/>,<xsl:value-of select="@FromLat"/>,0 <xsl:value-of select="@ToLong"/>,<xsl:value-of sel开发者_如何学Pythonect="@ToLat"/>,0
            </coordinates>
          </LineString>
        </Placemark>
      </xsl:for-each>
    </Folder>
  </xsl:template>

Following is a sample of the XML:

<Line>
    <Row PrimaryRoute="A-123" FROM_SYSTEM_ID="A-123-CAB-1"
        TO_SYSTEM_ID="A-123-CAM-3" FromLat="42.624948852000" 
        FromLong="-83.107221652500"
        ToLat="42.624940325900" ToLong="-83.107353167000" />
    <Row PrimaryRoute="A-123" FROM_SYSTEM_ID="A-123-CAM-1"
        TO_SYSTEM_ID="A-123-HH-16" FromLat="42.641662528600" 
        FromLong="-83.151500129600"
        ToLat="42.641709802200" ToLong="-83.151552587600" />
    <!-- additional rows here -->
</Line>


You can extract the CAM or CAB portion of the FROM_SYSTEM_ID attribute using a combination of substring-after and substring-before:

<xsl:value-of select="
    substring-before(
        substring-after(
            substring-after(@FROM_SYSTEM_ID, '-'), '-'), '-')"/>

Putting this together with your stylesheet:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Line">
    <Folder>
      <name>
        Lines
        <!--<xsl:value-of select="@name"/>-->
      </name>
      <xsl:for-each select="Row">
        <Placemark>
          <name>
            <xsl:value-of select="@FROM_SYSTEM_ID"/>
          </name>
          <description>
            <xsl:value-of select="@TO_SYSTEM_ID"/>
          </description>
          <styleUrl>
              <xsl:value-of select="
                  substring-before(
                      substring-after(
                          substring-after(@FROM_SYSTEM_ID, '-'), '-'), '-')"/>
          </styleUrl>
          <LineString>
            <tessellate>1</tessellate>
            <coordinates>
              <xsl:value-of select="@FromLong"/>,<xsl:value-of select="@FromLat"/>,0 <xsl:value-of select="@ToLong"/>,<xsl:value-of select="@ToLat"/>,0
            </coordinates>
          </LineString>
        </Placemark>
      </xsl:for-each>
    </Folder>
  </xsl:template>
</xsl:stylesheet>

Applied to this input:

<Line>
    <Row PrimaryRoute="A-123" FROM_SYSTEM_ID="A-123-CAB-1"
        TO_SYSTEM_ID="A-123-CAM-3" FromLat="42.624948852000" 
        FromLong="-83.107221652500"
        ToLat="42.624940325900" ToLong="-83.107353167000" />
    <Row PrimaryRoute="A-123" FROM_SYSTEM_ID="A-123-CAM-1"
        TO_SYSTEM_ID="A-123-HH-16" FromLat="42.641662528600" 
        FromLong="-83.151500129600"
        ToLat="42.641709802200" ToLong="-83.151552587600" />
</Line>

Produces the following result:

<Folder>
    <name>Lines</name>
    <Placemark>
        <name>A-123-CAB-1</name>
        <description>A-123-CAM-3</description>
        <styleUrl>CAB</styleUrl>
        <LineString>
            <tessellate>1</tessellate>
            <coordinates>-83.107221652500,42.624948852000,0
                -83.107353167000,42.624940325900,0
            </coordinates>
        </LineString>
    </Placemark>
    <Placemark>
        <name>A-123-CAM-1</name>
        <description>A-123-HH-16</description>
        <styleUrl>CAM</styleUrl>
        <LineString>
            <tessellate>1</tessellate>
            <coordinates>-83.151500129600,42.641662528600,0
                -83.151552587600,42.641709802200,0
            </coordinates>
        </LineString>
    </Placemark>
</Folder>
0

精彩评论

暂无评论...
验证码 换一张
取 消