0

私は基本的にこれの反対を探しています

私が扱っているXMLの例:

<profiledesc>
   <creation>
       Finding Aid encoded by Some Guy, <date normal="2011-09-21">21 September 2011</date>
   </creation>
   <langusage encodinganalog="546">
      Finding aid written in
      <language langcode="eng" scriptcode="latn" encodinganalog="041">
         English   
      </language>
   </langusage>
</profiledesc>

私が書いている XSLT の例 (関連する部分のみ):

<xsl:template priority="3" match="descgrp|eadheader|filedesc|titlestmt|profiledesc|archdesc|langusage|did">
   <xsl:apply-templates select="./child::node()"/>
</xsl:template>

<xsl:template priority="2" match="language">
   <atom name="EADLanguageOfFindingAid" type="text" size="short">
      <xsl:value-of select="."/>
   </atom>
   <atom name="EADLanguageCodeOfFindingAid" type="text" size="short">
       <xsl:value-of select="normalize-space(@langcode)"/>
   </atom>
</xsl:template>

... Other templates, for nodes like 'creation' ....

私が得ている(悪い)出力の例:

... Some other tags ...
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom>
Finding aid written in
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
... Some other tags ...

私が望む(良い)出力の例:

... Some other tags ...
<atom name="EADCreation" type="text" size="short">Finding Aid encoded by Some Guy, 21 September 2011</atom>
<atom name="EADLanguageOfFindingAid" type="text" size="short"> English </atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
... Some other tags ...

2 番目の出力では、"Finding aid written in" 行が欠落していることに注意してください

ご覧のとおり、"langusage" タグの "language" 部分だけを出力するようにテンプレートを設計しましたが、代わりに "Finding aid written in" テキスト ノードを含むタグ全体が出力されています。テキストノードが存在するかどうか、またはそれが最初 (または最後、または特定の位置) になるかどうかはわかりません。また、テキスト ノードまたは子ノードが 1 つしかないかどうかもわかりません。そのため、単に「[xth]」ノード (子またはテキスト) を選択することに依存するソリューションを利用することはできません。

この時点で、Google を介して解決策を見つけるのに役立ついくつかのキーワードでさえ、アドバイスをいただければ幸いです (これまでのところ、うまくいきませんでした)。

4

1 に答える 1

1

すべての子ノード (属性ノードとルート ノードを除く) を選択するのではなく、子要素のみを選択したいようです。langusagenode()

たとえば、このスタイルシート:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="langusage">
        <xsl:apply-templates select="*"/>
    </xsl:template>
    <xsl:template match="language">
        <atom name="EADLanguageOfFindingAid" type="text" size="short">
            <xsl:value-of select="normalize-space()"/>
        </atom>
        <atom name="EADLanguageCodeOfFindingAid" type="text" size="short">
            <xsl:value-of select="normalize-space(@langcode)"/>
        </atom>
    </xsl:template>
</xsl:stylesheet>

この単純化された入力に適用されます:

<profiledesc>
   <langusage encodinganalog="546">
      Finding aid written in
      <language langcode="eng" scriptcode="latn" encodinganalog="041">
         English   
      </language>
      <language langcode="esp" scriptcode="latn" encodinganalog="042">
         Spanish   
      </language>
   </langusage>
</profiledesc>

次の出力が生成されます。

<atom name="EADLanguageOfFindingAid" type="text" size="short">English</atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">eng</atom>
<atom name="EADLanguageOfFindingAid" type="text" size="short">Spanish</atom>
<atom name="EADLanguageCodeOfFindingAid" type="text" size="short">esp</atom>

不要なテキスト -- Finding aid written in -- は出力に表示されません。

次の点に注意してください*

<xsl:apply-templates select="*"/>

... は、より短い言い方child::*です。両方とも、現在のノードのすべての要素の子を選択します。

于 2012-07-11T05:37:40.387 に答える