2013-07-24 57 views
2

我正在使用XSLT從專利和商標局中提取商標XML文件中的一些數據。大部分都沒問題,只有一條空行。我可以用一個適度醜陋的解決方法擺脫它,但我想知道是否有更好的方法。XSLT轉換中的一個討厭的空白行

這裏是我的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文件。

回答

3

使用的模板的開頭你正在使用的模板的結束同樣的伎倆砍樣式表節點樹空<xsl:text/>說明:

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

完美,謝謝!你能解釋爲什麼這個文件中的第一個模板需要這個,但其他7個不需要? – codingatty

+1

不是沒有看到您的輸入XML,沒有。需要記住的是,任何出現在同一文本節點中的非空白字符的換行符(或其他空白符號)都是重要的,並且將被複制到輸出中。如果你關心空格,通常最好把所有的文本文本放在xsl:文本指令中。 –

2

就個人而言,我認爲這是清潔劑使用一個concat()當你需要靜態文本和動態值組合:

<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> 

這也應該用空格顯示出來解決問題。

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沒有規則,一個標籤的結束分隔符/>必須與標籤的開始分隔符<位於同一行。標籤內部的空白區域被忽略(無害),並且行尾序列被認爲是空白區域。

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>內部空白將被視爲顯著,不會被包含在結果樹輸出。