XSLT WFS输出格式模块

这个 xslt Geoserver的模块是一个WFS输出格式生成器,它将基本输出(如GML)和XSLT 1.0样式表结合在一起,以生成用户选择的新文本输出格式。

此输出格式的配置可以直接在磁盘上执行,也可以通过REST API执行。

手动配置

输出的所有配置都驻留在 $GEOSERVER_DATA_DIR/wfs/transform 文件夹,如果已在Geoserver中安装了XSLT输出格式,则在启动时将创建该文件夹。

每个XSLT转换都必须在 $GEOSERVER_DATA_DIR/wfs/transform 文件夹,该文件夹又指向用于转换的XSLT文件。虽然名称可以是自由形式的,但建议遵循简单的命名约定:

  • 用于XML配置文件的.xml

  • 用于XSLT磁贴的<myTransform>.xslt

转换可以是全局的,因此可以适用于任何特征类型,也可以是特定类型的,在这种情况下,转换知道已转换的特征类型的特定属性。

全球转型示例

下面是一个全局转换设置的示例。这个 $GEOSERVER_DATA_DIR/wfs/transform/global.xml 文件将如下所示:

<transform>
  <sourceFormat>text/xml; subtype=gml/2.1.2</sourceFormat>
  <outputFormat>HTML</outputFormat>
  <outputMimeType>text/html</outputMimeType>
  <fileExtension>html</fileExtension>
  <xslt>global.xslt</xslt>
</transform>

以下是对每个元素的解释:

  • sourceFormat (必需):用作XSLT转换源的输出格式

  • outputFormat (必选):转换生成的输出格式

  • outputMimeType (可选):生成的输出的MIME类型。如果它丢失了, outputFormat 假定为MIME类型并用于此目的。

  • fileExtension (可选):生成的输出的文件扩展名。以防它不见了 txt 将会被使用。

  • xslt (必需):用于转换的XSLT 1.0样式表的名称

关联的XSLT文件将是 $GEOSERVER_DATA_DIR/wfs/transform/global.xslt 文件夹,它将能够将任何GML2输入转换为相应的HTML文件。下面是一个例子:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:wfs="http://www.opengis.net/wfs"
  xmlns:tiger="http://www.census.gov" xmlns:gml="http://www.opengis.net/gml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
      <xsl:for-each select="wfs:FeatureCollection/gml:featureMember/*">
        <h2><xsl:value-of select="@fid"/></h2>
        <table border="1">
          <tr>
            <th>Attribute</th>
            <th>Value</th>
          </tr>
            <!-- [not(*)] strips away all nodes having
                 children, in particular, geometries -->
            <xsl:for-each select="./*[not(*)]">
            <tr>
              <td>
                <xsl:value-of select="name()" />
              </td>
              <td>
                <xsl:value-of select="." />
              </td>
            </tr>
            </xsl:for-each>
        </table>
     </xsl:for-each>
     </body>
   </html>
  </xsl:template>
</xsl:stylesheet>

类型特定的转换

特定于类型的转换可以引用特定类型并直接利用其属性。虽然不是必需的,但最好是设置一个可以处理任何特征类型的全局转换(因为输出格式在功能文档中声明为通用的,而不是特定于类型的),然后为特定的特征类型覆盖它,以便为它们创建特殊的转换。

以下是特定于类型的转换声明的示例,它将位于 $GEOSERVER_DATA_DIR/wfs/transform/html_bridges.xml

<transform>
  <sourceFormat>text/xml; subtype=gml/2.1.2</sourceFormat>
  <outputFormat>HTML</outputFormat>
  <outputMimeType>text/html</outputMimeType>
  <fileExtension>html</fileExtension>
  <xslt>html_bridges.xslt</xslt>
  <featureType>
    <id>cite:Bridges</id>
  </featureType>
</transform>

临时演员 featureType 元素将变换关联到特定的要素类型

关联的XSLT文件将位于 $GEOSERVER_DATA_DIR/wfs/transform/html_bridges.xslt 并且将利用关于输入属性的知识:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:wfs="http://www.opengis.net/wfs"
  xmlns:cite="http://www.opengis.net/cite" xmlns:gml="http://www.opengis.net/gml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>Bridges</h2>
        <xsl:for-each
            select="wfs:FeatureCollection/gml:featureMember/cite:Bridges">
        <ul>
          <li>ID: <xsl:value-of select="@fid" /></li>
          <li>FID: <xsl:value-of select="cite:FID" /></li>
          <li>Name: <xsl:value-of select="cite:NAME" /></li>
        </ul>
        <p/>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

备注

在编写XSLT时,请始终记住在 stylesheet 元素,否则可能会遇到难以理解的错误消息。

特定要素类型可以与多个输出格式相关联。虽然不常见,但通过创建多个XML配置文件并在每个配置文件中关联不同的要素类型,也可以将同一XSLT文件关联到多个要素类型。

REST配置

可以通过REST API创建、更新和删除转换(通常,这需要管理员权限)。每个转换都用磁盘上使用的相同的XML格式表示,但有两种变体:

  • 一种新的 name 属性,该属性与XML文件名匹配

  • 这个 featureType 元素还包含指向REST配置树中表示要素类型的资源的链接

例如:

<transform>
  <name>test</name>
  <sourceFormat>text/xml; subtype=gml/2.1.2</sourceFormat>
  <outputFormat>text/html</outputFormat>
  <fileExtension>html</fileExtension>
  <xslt>test-tx.xslt</xslt>
  <featureType>
    <name>tiger:poi</name>
    <atom:link xmlns:atom="http://www.w3.org/2005/Atom" rel="alternate" href="http://localhost:8080/geoserver/rest/workspaces/cite/datastores/cite/featuretypes/bridges.xml" type="application/xml"/>
  </featureType>
</transform>

下面是资源列表以及可以在这些资源上使用的HTTP方法。

/rest/services/wfs/transforms[.<format>]

方法

行动

返回代码

格式

默认格式

参数

GET

列出所有可用的变换

200

HTML、XML、JSON

HTML

POST

添加新的转换

201,带 Location 标题

XML、JSON

名称、源格式、输出格式、输出MimeType

PUT

更新全局设置

200

XML、JSON

DELETE

405

这个 POST 方法可用于以两种方式创建转换:

  • 如果使用的内容类型为 application/xml 服务器将假定 <transform> 正在发布定义,并且XSLT将必须使用 PUT 具有内容类型的请求 application/xslt+xml 针对转型资源

  • 如果使用的内容类型为 application/xslt+xml 服务器将假定正在发布XSLT本身,并且 namesourceFormatoutputFormatoutputMimeType 查询参数将用于填充转换配置

/rest/services/wfs/transforms/<transform>[.<format>]

方法

行动

返回代码

格式

默认格式

GET

返回转换

200

HTML、XML、XSLT

HTML

POST

405

PUT

根据使用的MIME类型更新转换配置或其XSLT

200

XML、XSLT

DELETE

删除转换

200

根据请求中使用的内容类型,PUT操作的行为有所不同:

  • 如果使用的内容类型为 application/xml 服务器将假定 <transform> 正在发送定义并将对其进行更新

  • 如果使用的内容类型为 application/xslt+xml 服务器将假定正在发布XSLT本身,因此配置不会被修改,但与其相关联的XSLT将被覆盖