2013-03-15 69 views
0

我是XSLT新手,需要使用XSLT從美國專利和商標局的商標文件中提取一些字段。下面是一個典型的文件的一個非常簡化的副本:如何使用XSLT 1.0從此XML中提取字段?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Transaction xmlns:ns2="urn:us:gov:doc:uspto:trademark:status" xmlns="http://www.wipo.int/standards/XMLSchema/trademarks"> 
    <TradeMarkTransactionBody> 
    <TransactionContentDetails> 
     <TransactionCode>National Trademark Information</TransactionCode> 
     <TransactionData> 
     <TradeMarkDetails> 
      <TradeMark> 
      <RegistrationOfficeCode>US</RegistrationOfficeCode> 
      <ApplicationNumber>74631225</ApplicationNumber> 
      <ApplicationDate>1995-02-07-05:00</ApplicationDate> 
      <RegistrationNumber>2178784</RegistrationNumber> 
      <RegistrationDate>1998-08-04-04:00</RegistrationDate> 
      <FilingPlace>US</FilingPlace> 
      <MarkCurrentStatusDate>2008-08-11-04:00</MarkCurrentStatusDate> 
      <WordMarkSpecification> 
       <MarkVerbalElementText>JAVA </MarkVerbalElementText> 
      </WordMarkSpecification> 
      </TradeMark> 
     </TradeMarkDetails> 
     </TransactionData> 
    </TransactionContentDetails> 
    </TradeMarkTransactionBody> 
</Transaction> 

我希望能夠產生:

App number: 74631225 

這裏有幾個我失敗的嘗試;嘗試#1:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="utf-8" /> 
    <xsl:template match="/"> 
    App number: <xsl:value-of select="/Transaction/TradeMarkTransactionBody/TransactionContentDetails/TransactionData/TradeMarkDetails/TradeMark/ApplicationNumber"/> 
    </xsl:template> 
</xsl:stylesheet> 

僅產生:

App number: 

嘗試#2:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="utf-8" /> 
    <xsl:template match="/Transaction/TradeMarkTransactionBody/TransactionContentDetails/TransactionData/TradeMarkDetails/TradeMark"> 
    App number: <xsl:value-of select="ApplicationNumber"/> 
    </xsl:template> 
</xsl:stylesheet> 

生產:

National Trademark Information 



     US 
     74631225 
     1995-02-07-05:00 
     2178784 
     1998-08-04-04:00 
     US 
     2008-08-11-04:00 

      JAVA 

任何幫助,將不勝感激。一旦我通過這個大門,至少有一個領域工作,我希望我能進入我的項目的實質。如果有關係,我使用MSXSL和Treebeard(我認爲使用Saxon)進行測試。

回答

2

您的XSLT代碼缺少名稱空間聲明。檢查你的XML文檔中的根元素,它這樣說:

xmlns="http://www.wipo.int/standards/XMLSchema/trademarks" 

這意味着,任何你的XML文檔中的元素都在該命名空間。

另一方面,在XSLT中,您沒有指定任何名稱空間,這意味着您的XSLT處理器將使用「空白名稱空間」查找在XSLT中指定的元素名稱 - 例如,您的XSLT中提到的Transaction與您的Xml文檔中提到的Transaction(來自http://www.wipo.int/standards/XMLSchema/trademarks名稱空間)不是相同的元素。

XSLT,或者更確切地說,XPath的,不知道「默認」(前綴更少)的命名空間,這就是爲什麼你必須指定一些任意前綴的概念 - 說tm

<?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"> 
<xsl:output method="text" encoding="utf-8" /> 
    <xsl:template match="/"> 
    App number: <xsl:value-of select="/tm:Transaction/tm:TradeMarkTransactionBody/tm:TransactionContentDetails/tm:TransactionData/tm:TradeMarkDetails/tm:TradeMark/tm:ApplicationNumber"/> 
    </xsl:template> 
</xsl:stylesheet> 

這應該讓你更接近你正在尋找的東西。我只能在幾個小時內嘗試這個;如果您需要進一步的幫助,請留下評論,我會回頭看看這個問題。

+0

完美!這樣可行。非常感謝。 – codingatty 2013-03-15 00:59:30