1

私はこのxml文書を持っています:

<tags>
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="du" pos="PRP:det">des</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="de" pos="PRP">de</w>
<w lemme="le" pos="DET:ART">l'</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
<w lemme="," pos="PUN">,</w>
...
</tags>

記事と句読点を除外するために xsl を使用しようとしています。ここのように < w lemme="," pos="PUN" >、< /w > および < w lemme="de" pos="PRP" >de< /w> < w lemme="le" pos="DET :ART">l'< /w>。そこで、動作するがタグ < tags> を含むすべてのタグにすべての条件を一般化する次のスタイルシートを作成しました。

<xsl:template match="*">
<xsl:choose>
<xsl:when test="contains(@pos,'PUN')"></xsl:when>
<xsl:when test="contains(@pos,'PRP')"></xsl:when>
<xsl:when test="contains(@pos,'DET')"></xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:attribute name="lemme">
<xsl:value-of select="@lemme"/>
</xsl:attribute>
<xsl:attribute name="pos">
<xsl:value-of select="@pos"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

そして、私はこの結果を持っています:

<tags lemme="" pos="">
<w lemme="déclaration" pos="NOM">Déclaration</w>
<w lemme="droit" pos="NOM">droits</w>
<w lemme="homme" pos="NOM">homme</w>
<w lemme="et" pos="KON">et</w>
<w lemme="citoyen" pos="NOM">citoyen</w>

したがって、機能し、興味のある行のみが表示されますが、最初の行の < tags > タグに lemme="" pos="" も追加したくないだけです。< w > タグのみを取得するには、xsl で何を変更する必要がありますか。< xsl:template match="w" > を試しましたが、有効な xml が生成されませんでした。助けてください?

4

2 に答える 2

1

このテンプレートである標準の同一性変換を使用する必要があります。

<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

これをいつでも使用して、ソースから出力にすべてをコピーできます。例外は、次のような追加のテンプレートによって処理されます。

<xsl:template match="w[contains(@pos,'PUN')]
                    |w[contains(@pos,'PRP')]
                    |w[contains(@pos,'DET')]"/>

何もしません。単に不要な要素を照合し、ID 変換テンプレートがそれらを照合してコピーするのを防ぎます。完全なスタイルシートは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="w[contains(@pos,'PUN')]
                      |w[contains(@pos,'PRP')]
                      |w[contains(@pos,'DET')]"/>
</xsl:stylesheet>
于 2013-01-09T22:20:43.637 に答える
0

これを解決するにはいくつかの方法がありますが、既にあるものを拡張する 1 つの方法は、1 つのルールを一致させてタグ要素を出力し、次に w 要素のみに一致する 2 番目のテンプレートを適用することです。

最初のビットとして、このテンプレートを既存のテンプレートの前に追加します。

<xsl:template match="/tags">
<xsl:copy>
<xsl:apply-templates select="w"/>
</xsl:copy>
</xsl:template>

2 番目のビットとして、現在のテンプレートを次のように変更します。

<xsl:template match="w">

わかりやすくするために、完全なスタイルシートを次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>

    <xsl:template match="/tags">
        <xsl:copy>
            <xsl:apply-templates select="w"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="w">
        <xsl:choose>
            <xsl:when test="contains(@pos,'PUN')"></xsl:when>
            <xsl:when test="contains(@pos,'PRP')"></xsl:when>
            <xsl:when test="contains(@pos,'DET')"></xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:attribute name="lemme">
                        <xsl:value-of select="@lemme"/>
                    </xsl:attribute>
                    <xsl:attribute name="pos">
                        <xsl:value-of select="@pos"/>
                    </xsl:attribute>
                    <xsl:apply-templates/>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

これにより、期待される結果が得られます。

<?xml version="1.0" encoding="utf-8"?>
<tags>
    <w lemme="déclaration" pos="NOM">Déclaration</w>
    <w lemme="droit" pos="NOM">droits</w>
    <w lemme="homme" pos="NOM">homme</w>
    <w lemme="et" pos="KON">et</w>
</tags>

お役に立てれば。

于 2013-01-09T21:26:24.547 に答える