2

我正在使用 XSLT 从专利商标局的商标 XML 文件中提取一些数据。基本上没问题,除了一个空行。我可以用一个适度丑陋的解决方法来摆脱它,但我想知道是否有更好的方法。

这是我的 XSLT 的一个子集:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tm="http://www.wipo.int/standards/XMLSchema/trademarks" xmlns:pto="urn:us:gov:doc:uspto:trademark:status">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:template match="tm:Transaction">
<xsl:apply-templates select=".//tm:TradeMark"/>
<xsl:apply-templates select=".//tm:ApplicantDetails"/>
<xsl:apply-templates select=".//tm:MarkEvent"/>
</xsl:template>

<xsl:template match="tm:TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>
ApplicationNumber,"<xsl:value-of select="normalize-space(tm:ApplicationNumber)"/>"<xsl:text/>
ApplicationDate,"<xsl:value-of select="normalize-space(tm:ApplicationDate)"/>"<xsl:text/>
RegistrationNumber,"<xsl:value-of select="normalize-space(tm:RegistrationNumber)"/>"<xsl:text/>
RegistrationDate,"<xsl:value-of select="normalize-space(tm:RegistrationDate)"/>"<xsl:text/>
<xsl:apply-templates select="tm:WordMarkSpecification"/>
<xsl:apply-templates select="tm:TradeMarkExt"/>
<xsl:apply-templates select="tm:PublicationDetails"/>
<xsl:apply-templates select="tm:RepresentativeDetails"/>
</xsl:template>

<xsl:template match="tm:WordMarkSpecification">
MarkVerbalElementText,"<xsl:value-of select="normalize-space(tm:MarkVerbalElementText)"/>"<xsl:text/>
</xsl:template>

它还有一些模板,但这就是它的要点。我总是在输出的最开始,在任何数据之前得到一个空行;我没有得到任何其他空白行。我的规避是将两条线结合起来:

<xsl:template match="tm:TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>

成一行:

<xsl:template match="tm:TradeMark">MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>

这行得通,如果没有更好的方法,我想我可以接受,但它似乎不雅,对我来说就像一个杂物。其他模板都不需要这种处理(例如 tm:WordMarkSpecification 模板或之后的另外六个模板)),我很困惑为什么这里需要它。有任何想法吗?

因为我可以在 XSLT 中看到插入空行的特定点,所以我认为提供我正在测试的 XML 没有帮助,但如果您确实需要查看它,您可以在https://tsdrapi获得它.uspto.gov/ts/cd/casestatus/rn2178784/download.zip;它是该存档中的 XML 文件。

4

4 回答 4

3

在模板的开头使用您在模板末尾使用的相同技巧,以使用空<xsl:text/>指令分割样式表节点树:

<xsl:template match="tm:TradeMark">
<xsl:text/>MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>
于 2013-07-24T01:14:25.897 回答
2

就个人而言,我认为concat()在需要结合静态文本和动态值时使用 a 会更干净:

<xsl:template match="tm:TradeMark">
  <xsl:value-of 
   select="concat(
   'MarkCurrentStatusDate,&quot;', normalize-space(tm:MarkCurrentStatusDate), '&quot;',
   'ApplicationNumber,&quot;', normalize-space(tm:ApplicationNumber), '&quot;',
   'ApplicationDate,&quot;', normalize-space(tm:ApplicationDate), '&quot;',
   'RegistrationNumber,&quot;', normalize-space(tm:RegistrationNumber), '&quot;',
   'RegistrationDate,&quot;', normalize-space(tm:RegistrationDate), '&quot;'
    )"/>
  <xsl:apply-templates select="tm:WordMarkSpecification"/>
  <xsl:apply-templates select="tm:TradeMarkExt"/>
  <xsl:apply-templates select="tm:PublicationDetails"/>
  <xsl:apply-templates select="tm:RepresentativeDetails"/>
</xsl:template>

这也应该解决您出现空白的问题。

于 2013-07-24T03:35:49.063 回答
1

请记住,您始终可以使用 XML 语法来忽略开始和结束标记分隔符内的行尾序列:

<xsl:template match="tm:TradeMark"
>MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"
/>"ApplicationNumber,"<xsl:value-of select="normalize-space(tm:ApplicationNumber)"
/>"ApplicationDate,"<xsl:value-of select="normalize-space(tm:ApplicationDate)"
/>"RegistrationNumber,"<xsl:value-of select="normalize-space(tm:RegistrationNumber)"
/>"RegistrationDate,"<xsl:value-of select="normalize-space(tm:RegistrationDate)"
/>"<xsl:apply-templates select="tm:WordMarkSpecification"/>
<xsl:apply-templates select="tm:TradeMarkExt"/>
<xsl:apply-templates select="tm:PublicationDetails"/>
<xsl:apply-templates select="tm:RepresentativeDetails"/>
</xsl:template>

XML 中没有规定标记的结束分隔符/>必须与标记的开始分隔符位于同一行<。标记内的空白被忽略(无害),行尾序列被视为空白。

于 2013-07-24T15:03:08.840 回答
1

如果您希望在没有额外换行符或空格的情况下发出所有文本,则将文字文本放在<xsl:text>元素内。

<xsl:template match="tm:TradeMark">
    <xsl:text>MarkCurrentStatusDate,"</xsl:text>
        <xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>
    <xsl:text>"</xsl:text>
    <xsl:text>ApplicationNumber,"</xsl:text>
        <xsl:value-of select="normalize-space(tm:ApplicationNumber)"/>
    <xsl:text>"</xsl:text>
    <xsl:text>ApplicationDate,"</xsl:text>
        <xsl:value-of select="normalize-space(tm:ApplicationDate)"/>
    <xsl:text>"</xsl:text>
    <xsl:text>RegistrationNumber,"</xsl:text>
        <xsl:value-of select="normalize-space(tm:RegistrationNumber)"/>
    <xsl:text>"</xsl:text>
    <xsl:text>RegistrationDate,"</xsl:text>
        <xsl:value-of select="normalize-space(tm:RegistrationDate)"/>
    <xsl:text>"</xsl:text>
    <xsl:apply-templates select="tm:WordMarkSpecification"/>
    <xsl:apply-templates select="tm:TradeMarkExt"/>
    <xsl:apply-templates select="tm:PublicationDetails"/>
    <xsl:apply-templates select="tm:RepresentativeDetails"/>
</xsl:template>

这样, 内部的任何换行符和空格<xsl:template>都不会被视为重要并且不会包含在结果树输出中。

于 2013-07-30T00:55:00.260 回答