首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT转换中的一个讨厌的空白行

XSLT转换中的一个讨厌的空白行
EN

Stack Overflow用户
提问于 2013-07-24 00:48:36
回答 4查看 1.7K关注 0票数 2

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

下面是XSLT的一个子集:

代码语言:javascript
复制
<?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>

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

代码语言:javascript
复制
<xsl:template match="tm:TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>

变成一行:

代码语言:javascript
复制
<xsl:template match="tm:TradeMark">MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>

这是可行的,如果没有更好的东西的话,我想我可以接受,但对我来说,这似乎是不雅的,也是一种套话。其他模板都不需要这种处理(例如tm:WordMarkSpecification或其后的6个模板),我很困惑为什么这里需要这样的模板。有什么想法吗?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-24 01:14:25

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

代码语言:javascript
复制
<xsl:template match="tm:TradeMark">
<xsl:text/>MarkCurrentStatusDate,"<xsl:value-of select="normalize-space(tm:MarkCurrentStatusDate)"/>"<xsl:text/>
票数 3
EN

Stack Overflow用户

发布于 2013-07-24 03:35:49

就我个人而言,我认为当您需要组合静态文本和动态值时,使用concat()比较干净:

代码语言:javascript
复制
<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>

这也可以解决你的问题,空白出现。

票数 2
EN

Stack Overflow用户

发布于 2013-07-24 15:03:08

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

代码语言:javascript
复制
<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中没有关于标记的结束分隔符/>必须与标记的开始分隔符<位于同一行的规则。标签内部的空白被忽略(在其中无害),行尾序列被认为是空白。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17823425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档