2011-04-05 70 views
1

我使用xsl將xml轉換爲kml格式。我想向xsl添加條件邏輯來根據屬性值的一部分切換styleUrl。屬性名稱是FROM_SYSTEM_ID。屬性值的格式是「A-123-CAM-1」,其中「CAM」是字符串的一部分,用於確定要使用哪種樣式定義(在這種情況下,CAM代表相機,CAB代表櫥櫃等)。XSL條件格式

如何解析此屬性以執行所需的樣式定義切換?

以下是我的XSL模板:

<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 select="@ToLat"/>,0 
      </coordinates> 
      </LineString> 
     </Placemark> 
     </xsl:for-each> 
    </Folder> 
    </xsl:template> 

以下是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> 

回答

0

可以使用的substring-after組合提取FROM_SYSTEM_ID屬性的CAMCAB部分和substring-before

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

與你一起的樣式表把這個:

<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> 

應用於此輸入:

<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> 

產生以下結果:

<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

+1正確的。如果模式字符串是固定的,或者只是'substring()'。 – 2011-04-05 17:25:37

+0

感謝@lwburk,這很好。爲了引用我的樣式定義'' – Arkady 2011-04-05 20:46:24