0

XSLT はまだかなり新しいものです。XSLT (1.0) を使用して、XML ファイルから特定のフィールドだけを抽出しようとしています。以下は、実際の XML ドキュメントの単純化された形式です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Transaction>
  <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>

これが私のXSLTの試みです:

<?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:strip-space elements="*"/>

<xsl:template match="Transaction">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="TradeMark">
MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
ExpirationDate,"<xsl:value-of select="ExpirationDate"/>"
<xsl:apply-templates select="WordMarkSpecification"/>
</xsl:template>

<xsl:template match="WordMarkSpecification">
MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
</xsl:template>
</xsl:stylesheet>

これはほぼ機能し、次のようになります。

National Trademark Information
MarkCurrentStatusDate,"2008-08-11-04:00"
ApplicationNumber,"74631225"
ApplicationDate,"1995-02-07-05:00"
RegistrationNumber,"2178784"
RegistrationDate,"1998-08-04-04:00"
ExpirationDate,""

MarkVerbalElementText,"JAVA"

TransactionCode私の質問: 1) (" National Trademark Information" 出力で) のような不要なデータを取得しないようにするにはどうすればよいですか? ExpirationDate2)との間の空白行を避けるにはどうすればよいMarkVerbalElementTextですか? (XSLT ファイルの空白行ではないことを確認しました。空白行を省略しても効果はありません。)

(これら 2 つの質問には 1 つの答えがあるのではないかと思います。選択されていないMarkVerbalElementTextテキストと、選択されていない改行を何らかの形で保持していると思われます。)

4

3 に答える 3

0

別の (やや複雑な) プル アプローチを次に示します。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:util="urn:util">

    <xsl:output
        method="text" 
        encoding="utf-8"/>

    <xsl:strip-space elements="*"/>

    <xsl:variable name="fields" select="document('')/*/util:fields"/>
    <util:fields>
        <field>MarkCurrentStatusDate</field>
        <field>ApplicationNumber</field>
        <field>ApplicationDate</field>
        <field>RegistrationNumber</field>
        <field>RegistrationDate</field>
        <field>ExpirationDate</field>
        <field>MarkVerbalElementText</field>
    </util:fields>

    <xsl:template match="/">
        <xsl:variable name="xml" select="."/>
        <xsl:for-each select="$fields/field">
            <xsl:variable name="f" select="."/>
            <xsl:value-of select="$f"/>
            <xsl:text>="</xsl:text>
            <xsl:value-of select="normalize-space($xml//TradeMark//*[local-name() = $f])"/>
            <xsl:text>"&#x000A;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Saxon 6.5.5、Saxon-EE 9.4.0.3、xsltproc を libxml/20708 および libxslt/10126 で使用すると、次の出力が得られます。

MarkCurrentStatusDate="2008-08-11-04:00"
ApplicationNumber="74631225"
ApplicationDate="1995-02-07-05:00"
RegistrationNumber="2178784"
RegistrationDate="1998-08-04-04:00"
ExpirationDate=""
MarkVerbalElementText="JAVA"

あなたが提供したサンプル XML を超えて持ちこたえているとはあまり確信が持てませんが、そこでは機能します。

于 2013-04-11T04:00:20.453 に答える
0

あなたはほとんどそこにいます。最初のテンプレートは文書全体を「消費」します。タグのみが必要な場合は、対象のTradeMarkタグのみに適用するだけです。

<xsl:template match="Transaction">
    <xsl:apply-templates select=".//TradeMark"/>
</xsl:template>
于 2013-04-11T02:53:27.737 に答える
-1

提供された変換のわずかな修正と単純化 (1 つの不要なテンプレートを削除) を次に示します。これで、必要な正しい結果が生成されます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:strip-space elements="*"/>

 <xsl:template match="TradeMark">
    MarkCurrentStatusDate,"<xsl:value-of select="MarkCurrentStatusDate"/>"
    ApplicationNumber,"<xsl:value-of select="ApplicationNumber"/>"
    ApplicationDate,"<xsl:value-of select="ApplicationDate"/>"
    RegistrationNumber,"<xsl:value-of select="RegistrationNumber"/>"
    RegistrationDate,"<xsl:value-of select="RegistrationDate"/>"
    ExpirationDate,"<xsl:value-of select="ExpirationDate"/><xsl:text>"</xsl:text>
    <xsl:apply-templates select="WordMarkSpecification"/>
 </xsl:template>

 <xsl:template match="WordMarkSpecification">
    MarkVerbalElementText,"<xsl:value-of select="normalize-space(MarkVerbalElementText)"/>"
 </xsl:template>

 <xsl:template match="TransactionCode"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

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

必要な正しい結果が生成されます。

MarkCurrentStatusDate,"2008-08-11-04:00"
ApplicationNumber,"74631225"
ApplicationDate,"1995-02-07-05:00"
RegistrationNumber,"2178784"
RegistrationDate,"1998-08-04-04:00"
ExpirationDate,""
MarkVerbalElementText,"JAVA"

説明:

  1. 空のテンプレート:

    <xsl:template match="TransactionCode"/>

    要素に一致する XSLT 組み込みテンプレートをオーバーライドする役割を果たし、一致した要素のすべてのテキスト ノードの子孫の連結を生成します。

  2. 行末の<xsl:text>"</xsl:text>は、次の改行文字が目的の出力の一部として解釈されるのを防ぎます。したがって、観察された空行は削除されます。

  3. 要素に一致する XSLT 組み込みテンプレートとまったく同じように動作するため、テンプレート マッチングTransactionは削除されます。テンプレートはそのすべての子に適用されます。

于 2013-04-11T02:59:43.360 に答える