2013-03-15 47 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