【发布时间】:2016-03-28 15:35:57
【问题描述】:
如何使用以下 XML 仅将地址详细信息提取为 CSV 格式?
我相信我需要一个基于身份模板的样式表,尽管我找到的示例很简单,并且在列表中列出了您要排除的元素。是否有一种简单的方法可以排除除 Address 和 AddressLine 之外的所有内容?
我正在使用 .NET 来处理 XLST 转换。到目前为止我提出的样式表没有返回任何内容。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:param name="delim" select="','" />
<xsl:param name="quote" select="'"'" />
<xsl:param name="break" select="'
'" />
<xsl:template match="node()| @*">
<xsl:copy>
<xsl:apply-templates select="node()| @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="AddressLine" priority="9">
<xsl:value-of select="concat($quote, ., $quote, $delim)"/>
</xsl:template>
<xsl:template match="*" priority="0" />
</xsl:stylesheet>
<Sample Version="6" Date="2012-05-11">
<Header>
<CreatedDate>2015-12-02</CreatedDate>
<CreatedTime>10:31:42</CreatedTime>
</Header>
<Message Group="1" Type="1" Protocol="1">
<MessageHeader>
<MessageReferenceNumber>1</MessageReferenceNumber>
</MessageHeader>
<TransactionHeader>
<ReportPeriodStartDate>2002-04-01</ReportPeriodStartDate>
<ReportPeriodEndDate>2015-11-30</ReportPeriodEndDate>
</TransactionHeader>
<Episode>
<Person>
<General>
<Verified Status="02">
<Identifier>001</Identifier>
<PersonName>
<Name>
<FirstName>Foo</FirstName>
<Surname>Bar</Surname>
</Name>
</PersonName>
<Address>
<AddressLine></AddressLine>
<AddressLine>Street</AddressLine>
<AddressLine>Town</AddressLine>
<AddressLine>City</AddressLine>
</Address>
</Verified>
</General>
</Person>
<Session>
<Input>
<StartDate>2015-10-31</StartDate>
<StartTime>17:15:00</StartTime>
</Input>
<Output>
<StatusCode>8</StatusCode>
<LocationCode>9</LocationCode>
</Output>
</Session>
</Episode>
<MessageTrailer>
<MessageReferenceNumber>1</MessageReferenceNumber>
</MessageTrailer>
</Message>
<Message Group="1" Type="1" Protocol="1">
<MessageHeader>
<MessageReferenceNumber>2</MessageReferenceNumber>
</MessageHeader>
<TransactionHeader>
<ReportPeriodStartDate>2002-04-01</ReportPeriodStartDate>
<ReportPeriodEndDate>2015-11-30</ReportPeriodEndDate>
</TransactionHeader>
<Episode>
<Person>
<General>
<Verified Status="02">
<Identifier>002</Identifier>
<PersonName>
<Name>
<FirstName>Foo</FirstName>
<Surname>Bar</Surname>
</Name>
</PersonName>
<Address>
<AddressLine></AddressLine>
<AddressLine>Street</AddressLine>
<AddressLine>Town</AddressLine>
<AddressLine>City</AddressLine>
</Address>
</Verified>
</General>
</Person>
<Session>
<Input>
<StartDate>2015-10-31</StartDate>
<StartTime>17:15:00</StartTime>
</Input>
<Output>
<StatusCode>8</StatusCode>
<LocationCode>9</LocationCode>
</Output>
</Session>
</Episode>
<MessageTrailer>
<MessageReferenceNumber>2</MessageReferenceNumber>
</MessageTrailer>
</Message>
<Trailer>
<RecordCount>2</RecordCount>
</Trailer>
</Sample>
【问题讨论】:
-
请注意,您当前的 XSLT 不返回任何内容的原因是模板匹配
<xsl:template match="*" priority="0" />。这实际上比身份模板具有更高的优先级(默认优先级为 -0.5)。因此,此模板匹配根元素Sample,并在此处停止处理。 (如果您希望它跳过该元素并继续处理其子元素,则应显式添加<xsl:apply-templates />指令)。