如何使用XSLT 1.0从此XML中提取字段?

时间:2013-03-15 00:46:02

标签: xslt namespaces

我是XSLT的新手,需要使用XSLT从美国专利商标局的商标文件中提取一些字段。这是典型文件的非常简化的副本:

<?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)进行测试。

1 个答案:

答案 0 :(得分: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>

这可以让您更接近您所寻找的目标。我可以在几个小时后尝试这个;如果您需要进一步的帮助,请发表评论,我会回答这个问题。