在XSLT中交叉引用數據的首選方法是使用<xsl:key>
。下面的XSLT應該這樣做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:foi="foifoifoi" xmlns:rdf="rdfrdf"
exclude-result-prefixes="foi rdf">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="kService" match="foi:serviceInfo" use="@rdf:ID"/>
<xsl:template match="/*">
<div>
<xsl:apply-templates select="foi:serviceRequest" />
</div>
</xsl:template>
<xsl:template match="foi:serviceRequest">
<xsl:variable name="referenceId"
select="substring(foi:servicing/@rdf:resource, 2)" />
<xsl:variable name="info" select="key('kService', $referenceId)[1]"/>
<div>
<xsl:value-of select="foi:creationDate"/>
<xsl:apply-templates select="$info/*" />
</div>
</xsl:template>
<xsl:template match="foi:serviceInfo/*">
<xsl:value-of select="concat(' - ', .)"/>
</xsl:template>
</xsl:stylesheet>
(我不得不作出了命名空間foi
和rdf
因爲你沒有說明他們請正確的URI代替)。當在這個XML運行(具有根節點加入):
<root xmlns:foi="foifoifoi" xmlns:rdf="rdfrdf">
<foi:serviceInfo rdf:ID="SI1">
<foi:serviceName>Sewer</foi:serviceName>
<foi:problemCode>SI1</foi:problemCode>
<foi:division>Water</foi:division>
</foi:serviceInfo>
<foi:serviceInfo rdf:ID="SI2">
<foi:serviceName>Recycling</foi:serviceName>
<foi:problemCode>SI2</foi:problemCode>
<foi:division>Solid Waste</foi:division>
</foi:serviceInfo>
<foi:serviceRequest rdf:ID="R1">
<foi:creationDate>29 03 2013</foi:creationDate>
<foi:servicing rdf:resource="#SI1"/>
</foi:serviceRequest>
<foi:serviceRequest rdf:ID="R2">
<foi:creationDate>29 06 2013</foi:creationDate>
<foi:servicing rdf:resource="#SI2"/>
</foi:serviceRequest>
</root>
這產生:
<div>
<div>29 03 2013 - Sewer - SI1 - Water</div>
<div>29 06 2013 - Recycling - SI2 - Solid Waste</div>
</div>
要點:
- 一個
xsl:key
的使用,以允許通過特定的定位foi:serviceInfo
ID
。
- 使用
key()
函數按ID查找相關foi:serviceInfo
。最後的[1]
限制了第一場比賽。我不確定是否有可能會有不止一場比賽,但在那裏?
- 用於將
foi:serviceInfo
的任何子項作爲連字符加上元素值的模板。
非常感謝JL。這工作得很好。在這種情況下,可以有多個與serviceInfo關聯的serviceRequest。 – user2035965
我看到,所以多個serviceRequest可以引用同一個serviceInfo,但每個serviceRequest只引用一個serviceInfo(換句話說,serviceRequest-> serviceInfo是多個 - >一個)? – JLRishe
是的,這是正確的。再次感謝 – user2035965