【问题标题】:XSL conditional formattingXSL 条件格式
【发布时间】:2011-04-06 01:38:20
【问题描述】:

我正在使用 xsl 将 xml 转换为 kml 格式。我想向 xsl 添加条件逻辑,以根据部分属性值切换 styleUrl。属性名称为FROM_SYSTEM_ID。属性值的格式是“A-123-CAM-1”,其中“CAM”是字符串的一部分,用于确定要使用的样式定义(在这种情况下,CAM 代表相机,CAB 代表橱柜等)。

如何解析这个属性来执行所需的样式定义切换?

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

【问题讨论】:

    标签: xslt


    【解决方案1】:

    您可以使用substring-aftersubstring-before 的组合提取FROM_SYSTEM_ID 属性的CAMCAB 部分:

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

    【讨论】:

    • +1 正确。如果模式字符串是固定的,或者只是substring()
    • 谢谢@lwburk,效果很好。我在值之前添加了一个井号,以引用我的样式定义&lt;xsl:value-of select="concat($hash,substring-before(substring-after(substring-after(@FROM_SYSTEM_ID, '-'), '-'), '-'))"/&gt;
    猜你喜欢
    • 2020-03-04
    • 1970-01-01
    • 2011-11-06
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    相关资源
    最近更新 更多