我有一个
XML样本,看起来像:
<?xml version="1.0" encoding="UTF-8"?> <root> <location id="1"> <address>1600 Pennsylvania Avenue</address> <address>211B Baker Street</address> </location> <location id="1"> <address>17 Cherry Tree Lane</address> </location> <location id="2"> <address>350 5th Avenue</address> </location> </root>
<?xml version="1.0" encoding="utf-8"?> <result> <location id="1"> <address addressId="1">1600 Pennsylvania Avenue</address> <address addressId="2">211B Baker Street</address> </location> <location id="1"> <address addressId="3">17 Cherry Tree Lane</address> </location> <location id="2"> <address addressId="1">350 5th Avenue</address> </location> </result>
这样,addressId反映了具有相同id属性的所有位置实例的地址序列.
我在想<xsl:number>
将是我的答案,但我的尝试失败了:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/root"> <result> <xsl:for-each select="location"> <location> <xsl:attribute name="id"> <xsl:value-of select="@id" /> </xsl:attribute> <xsl:for-each select="address"> <address> <xsl:attribute name="addressId"> <xsl:number count="//location[@id = ../@id]/address" level="any" /> </xsl:attribute> <!-- The rest are just my debugging attempts; curIoUsly addressId3 and addressId4 return different values? --> <!-- <xsl:attribute name="addressId2"> <xsl:number count="//location[@id = parent::location/@id]/address" level="any" /> </xsl:attribute> <xsl:attribute name="addressId3"> <xsl:value-of select="count(//location[@id=../@id]/address)" /> </xsl:attribute> <xsl:variable name="Locid"> <xsl:value-of select="../@id" /> </xsl:variable> <xsl:attribute name="addressId4"> <xsl:value-of select="count(//location[@id=$Locid]/address)" /> </xsl:attribute> <xsl:attribute name="addressId5"> <xsl:number count="//location[@id = '1']/address" level="any" /> </xsl:attribute> --> <xsl:value-of select="." /> </address> </xsl:for-each> </location> </xsl:for-each> </result> </xsl:template> </xsl:stylesheet>
解决方法
这是一种解决方法,通过简单地计算具有相同id属性的位置parent的前面的地址元素:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="location/address"> <xsl:copy> <xsl:attribute name="addressId"> <xsl:value-of select="count(preceding::address[../@id = current()/../@id]) + 1"/> </xsl:attribute> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。