0

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

どんな助けでも大歓迎です。この門をくぐり抜けて、少なくとも 1 つのフィールドが機能するようになったら、自分のプロジェクトの実際の内容に入りたいと思います。問題があれば、テストには MSXSL と Treebeard (Saxon を使用していると思います) の両方を使用しています。

4

1 に答える 1

2

XSLT コードに名前空間宣言がありません。Xml ドキュメントのルート要素を確認してください。次のように書かれています。

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

つまり、Xml ドキュメント内のすべての要素がその名前空間にあるということです。

一方、XSLT では名前空間を指定しませんでした。つまり、XSLT プロセッサは XSLT で指定された要素名を「空白の名前空間」で検索します。たとえばTransaction、XSLT で言及されている要素はTransaction(名前空間からhttp://www.wipo.int/standards/XMLSchema/trademarks) Xml ドキュメントに記載されています。

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>

これにより、探しているものに一歩近づくはずです。これは数時間後にしか試すことができません。さらにサポートが必要な場合は、コメントを残してください。この質問について再度確認します。

于 2013-03-15T00:50:10.693 に答える