使用LandXML创建表

时间:2018-06-01 22:27:05

标签: xml xslt xpath transformation

我正在使用LandXML创建下表,但我想填充纬度和经度而不是Northing和Easting值。

Original Result

Desired Result

我知道AlignPIs具有属性和嵌套属性,如下所示,但很难绕过访问它们并将它们放入实际表格中。 [AlignPIs属性映射] [3]

AlignPI Mapping

PI Mapping

这是我到目前为止的代码



 <?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:lx="http://www.landxml.org/schema/LandXML-1.2" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:landUtils="http://www.autodesk.com/land/civil/vcedit"
	xmlns:lxml="urn:lx_utils">
	<!--Description:Tabulation of Alignment PI with Station, Latitude and Longitude.
This form is valid for LandXML 0.88, 1.0, 1.1 and 1.2 data.-->
	<!--CreatedBy:Mark Hultgren -->
	<!--DateCreated:06/01/2018 -->
	<!--LastModifiedBy:Mark Hultgren -->
	<!--DateModified:06/01/2018 -->
	<!--OutputExtension:html -->
	<xsl:output method="html" encoding="UTF-8" />
	<!-- ==== JavaScript Includes ==== -->
	<xsl:include href="header.xsl" />
	<xsl:include href="UELS_Alignment_Layout.xsl" />
	<!--AlignmentPI Parameters-->
	<xsl:param name="PINumber" select="//lx:AlignPI/*/@pntRef" />
	<xsl:param name="PIStation" select="//lx:AlignPI/*/@Station" />
	<xsl:param name="PILatitude" select="//lx:AlignPI/*/@latitude" />
	<xsl:param name="PILongitude" select="//lx:AlignPI/*/@longitude" />
		<xsl:template match="/">
			<xsl:for-each select="AlignPIs" test="//lx:AlignPI/*/@PI">
				<!--if there is diameterUnit, use it as pipe diameter dimension unit-->
				<xsl:value-of select="//lx:Units/*/@diameterUnit" />
			</xsl:for-each>
			<xsl:otherwise>
				<!--otherwise, use linearUnit-->
				<xsl:value-of select="//lx:Units/*/@linearUnit" />
			</xsl:otherwise>
		</xsl:template>
	</xsl:param>
		<!-- ============================= -->
	<xsl:template match="/">
		<html>
			<head>
				<title>Alignment PI Station report with Latitude and Longitude<br/>  for <xsl:value-of select="//lx:Project/@name" /></title>
				<style type="text/css">
					div{
					width:10.5in;
					font-family:Verdana;
					}
					th{
					font-size:12pt;
					text-align:center;
					text-decoration:underline;
					}
					td{
					padding:0.02in 0.15in;
					text-align:right;
					}
					tr{
					font-size:10pt;
					}
				</style>
			</head>
			<body>
				<div>
					<xsl:call-template name="AutoHeader">
						<xsl:with-param name="ReportTitle">Alignment PI Report</xsl:with-param>
						<xsl:with-param name="ReportDesc">
							<xsl:value-of select="//lx:Project/@name" />
						</xsl:with-param>
					</xsl:call-template>
					<br />
					<xsl:for-each select="//lx:Alignment/lx:AlignPIs">					
					<b>Alignment: <xsl:value-of select="@name" /></b>
					<br />Project Name [(Edit This)]
					<table bordercolor="black" border="1" cellspacing="0" width="100%">
							<tr>
								<th>ID</th>
								<th>Station</th>
								<th>Latitude</th>
								<th>Longitude</th>
							</tr>
							<xsl:for-each select="./lx:AlignPIs/lx:AlignPI">
								<tr>
									<xsl:variable name="PINumber" select="pntRef/@text()"
									<xsl:variable name="Station" select="AlignPI/@Station" />
									<xsl:variable name="PI" select="latitude" />
									<xsl:variable name="PI" select="longitude" />
									<td>
										<xsl:value-of select="$PINumber" />
									</td>
									<td>
										<xsl:value-of select="$Station" />
									</td>
									<td>
										<xsl:value-of select="$latitude" />
									</td>
									<td>
										<xsl:value-of select="$longitude" />
									</td>
							</xsl:for-each>
					</table>
				</div>
			</body>
		</html>
	</xsl:template>
</xsl:stylesheet>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

您的XPath表达式和上下文节点似乎有些问题。 您将开始使用AlignPIs的上下文节点:

<xsl:for-each select="//lx:Alignment/lx:AlignPIs">

在此背景下,“。”指的是XSLT处理器当前正在处理的lx:AlignPIs元素。在下一个内部for-each中,您必须编写以下内容以选择当前上下文中的所有<AlignPi>元素:

<xsl:for-each select="lx:AlignPI">

<xsl:for-each select="./lx:AlignPI">是等效陈述)

现在,第二个for-each块内的上下文节点是lx:AlignPI。

在定义变量时,您尝试引用PI子元素的纬度和经度属性。 针对纬度和经度尝试以下表达式:

<xsl:variable name="latitude" select="lx:PI/@latitude" />
<xsl:variable name="longitude" select="lx:PI/@longitude" />

详细说明:正如我所提到的,在内部<xsl:for-each ...>内,您的上下文节点现在是lx:AlignPI。纬度和经度属性未附加到lx:AlignPI,而是附加到PI子元素。因此,在XPath语句中,您需要首先“导航”到lx:PI元素,然后从那里访问属性。