1

私は長い間この解決策を探していましたが、あきらめる前にここでこの質問をしようと思いました.

27 個の XML ファイル (TEI 形式) があり、XSLT スタイルシート 2.0 が 1 つあります。すべての XML ファイルに入り、(1 つの) 新しい html ファイル (すべての名前の付いた人物のリスト) を作成する関数を作成しました。

XML 内の指名された人物は、次のようになります。

<persName role="addressee">Herr <roleName>Prof. Dr.</roleName>XYY</persName>

またはそのように:

<persName key="linktodatabank">Herr <roleName>Dr.</roleName> Hugo <surname>Müller</surname></persName>

<persName>Herr Heinz</persName>
<persName>Volkm</persName>

ただし、すべてのファイルに次のような名前を付けているため、(私の XSLT) は良い解決策ではありません。

<xsl:variable name="persName1" select="document('01_ML.xml')/tei:TEI//tei:persName"/>

var 名は persName2、persName3 などで続きます。ドキュメント名は同じ 02_ML、03_ML などで続きます。カウンターがあるとよいことはわかっていますが、これを行う方法がわかりません。すべてのドキュメントに名前を付けた後 (placeNames と用語の抽出で同じことを行います)、コレクションを作成し (これも良い解決策ではありません)、次のように試します。

 <xsl:variable name="collection2" select="$persName1, $persName2, $persName3, $persName4, $persName5, $persName7, $persName8, $persName9,
                           $persName10, $persName11, $persName12, $persName13, $persName14, $persName15, $persName16, $persName17, $persName18, $persName19, $persName20"></xsl:variable> 
                       <html xmlns="http://www.w3.org/1999/xhtml">
                           <head>
                               <link rel="stylesheet" type="text/css" href="persName.css"/>
                               <title>Personenregister</title></head>
                           <body>
                             <h1 class="title">Personenregister</h1>
                              <ul> 

                                  <xsl:for-each select="$collection2">
                                   <xsl:sort select="string()" order="ascending"/>
                                   <li class="liste"> 
                                       <xsl:variable name="personen" select="normalize-space(string-join(.//text()[not(parent::tei:roleName)], ''))
                                           "></xsl:variable>
                                       <xsl:variable name="personen2" select="normalize-space(string-join(.//text()[not(parent::tei:surname)], ''))
                                           "></xsl:variable>

                                       <xsl:choose>
                                           <xsl:when test="@key">
                                               <xsl:choose>
                                                   <xsl:when test="exists(tei:roleName)"> <a href="{@key}" target="_blank">    <xsl:value-of select="concat($personen, ', ', tei:roleName)"/> </a>
                                                   </xsl:when>
                                                   <xsl:when test="exists(tei:surname)"><a href="{@key}" target="_blank">    <xsl:value-of select="concat($personen2, ', ', tei:surname, ', ', tei:roleName)"/> </a></xsl:when>

                                                   <xsl:otherwise><a href="{@key}" target="_blank"><xsl:value-of select="$personen"/></a></xsl:otherwise>
                                               </xsl:choose>

                                           </xsl:when>
                                           <xsl:otherwise>
                                               <xsl:choose>
                                                   <xsl:when test="exists(tei:roleName)"><xsl:value-of select="concat($personen, ', ', tei:roleName)"/>

                                                   </xsl:when>
                                                   <xsl:otherwise><xsl:value-of select="$personen"/>
                                                      </xsl:otherwise>
                                               </xsl:choose>
                                           </xsl:otherwise>
                                       </xsl:choose>


                                   </li>  

私の html リストでは、すべての人をアルファベット順に名前を付ける必要があります。最初は姓、次に役割名、次に名字です。しかし、persName に時々現れる "Herr" や "Herrn" を削除する方法がわかりません。それを行う方法を知っていますか?

もう1つは、すべてのダブルネームを削除したいということです。複数回登場する名前もあります。

新しい html リストは次のようになります。

     <li class="liste"><a href="http://d-nb.info/gnd/118738380" target="_blank">Neisser, Albert </a></li>
<li class="liste">Spiethoff, Prof.</li>

私はこれらのコードをめちゃくちゃにしたと思います。誰かが私を助けることができれば、それは素晴らしいことです。

ありがとう!

アップデート:

ご協力ありがとうございました!それははるかに良く見えます!! xsl:result-document を使用しているため、このコードを本文に入れたことを忘れていました。したがって、xsl:template は使用できません。さまざまなバージョンを試したところ、次の解決策が見つかりました。

    <xsl:result-document href="persName.html" method="html" encoding="UTF-16"> 
 <xsl:variable name="collection2"  select="collection('./?select=*_ML.xml')//tei:persName[not(.=preceding-sibling::node())]"> </xsl:variable>
 <xsl:variable name="personen" select="normalize-space(string-join(.//text()[not(parent::tei:roleName)], ''))" />
       <xsl:variable name="personen2" select="normalize-space(string-join(.//text()[not(parent::tei:surname)], ''))" />

  <h1 class="title">Personenregister</h1>
<body>
                              <ul> 

       <xsl:for-each-group select="$collection2" group-by=".">
         <xsl:sort select="string()" order="ascending"/>
          <xsl:sort select="tei:surname" order="ascending"/>
          <xsl:sort select="tei:rolename" order="ascending"/>
          <xsl:sort select="tei:forename" order="ascending"/> 
<xsl:variable name="personen" select="normalize-space(string-join(.//text()[not(parent::tei:roleName)], ''))" />
       <xsl:variable name="personen2" select="normalize-space(string-join(.//text()[not(parent::tei:surname)], ''))" />
       <xsl:choose>
           <xsl:when test="@key">
               <xsl:choose>
                   <xsl:when test="exists(tei:roleName)"><a href="{@key}" target="_blank"><xsl:value-of select="concat($personen, ', ', tei:roleName)"                    /></a></xsl:when>
                   <xsl:when test="exists(tei:surname)" ><a href="{@key}" target="_blank"><xsl:value-of select="concat($personen2, ', ', tei:surname, ', ', tei:roleName)"/></a></xsl:when>
                   <xsl:otherwise><a href="{@key}" target="_blank"><xsl:value-of select="$personen"/></a></xsl:otherwise>
               </xsl:choose>
           </xsl:when>
           <xsl:otherwise>
               <xsl:choose>
                   <xsl:when test="exists(tei:roleName)"><xsl:value-of select="concat($personen, ', ', tei:roleName)"/></xsl:when>
                   <xsl:otherwise><xsl:value-of select="$personen"/></xsl:otherwise>
               </xsl:choose>
           </xsl:otherwise>
       </xsl:choose>

「Herr」と「Herrn」(Mr.) を使ったもの: 姓、名、役職だけを知りたいのですが、Mr. or Mrs. (Herr) は知りません。したがって、persName に表示されるたびに「Herr」を削除したい

4

1 に答える 1

1

XSLT の改訂版を次に示します。これはほとんど正確なコピーですが、構造的な変更が加えられています。

<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://uri.com/goes/here">
    <xsl:template match="/">
        <html>
           <head>
                <link rel="stylesheet" type="text/css" href="persName.css"/>
                <title>Personenregister</title>
            </head>
            <body>
                <h1 class="title">Personenregister</h1>
                <ul> 
                    <xsl:apply-templates select="collection('./?select=*_ML.xml')//tei:persName[not(.=preceding-sibling::node())]">
                        <xsl:sort select="string()" order="ascending"/>
                    </xsl:apply-templates>
                </ul>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="tei:persName">
        <xsl:message>
            <xsl:text>in template</xsl:text>
        </xsl:message>
        <li class="liste"> 
           <xsl:variable name="personen" select="normalize-space(string-join(.//text()[not(parent::tei:roleName)], ''))" />
           <xsl:variable name="personen2" select="normalize-space(string-join(.//text()[not(parent::tei:surname)], ''))" />
           <xsl:choose>
               <xsl:when test="@key">
                   <xsl:choose>
                       <xsl:when test="exists(tei:roleName)"><a href="{@key}" target="_blank"><xsl:value-of select="concat($personen, ', ', tei:roleName)"                    /></a></xsl:when>
                       <xsl:when test="exists(tei:surname)" ><a href="{@key}" target="_blank"><xsl:value-of select="concat($personen2, ', ', tei:surname, ', ', tei:roleName)"/></a></xsl:when>
                       <xsl:otherwise><a href="{@key}" target="_blank"><xsl:value-of select="$personen"/></a></xsl:otherwise>
                   </xsl:choose>
               </xsl:when>
               <xsl:otherwise>
                   <xsl:choose>
                       <xsl:when test="exists(tei:roleName)"><xsl:value-of select="concat($personen, ', ', tei:roleName)"/></xsl:when>
                       <xsl:otherwise><xsl:value-of select="$personen"/></xsl:otherwise>
                   </xsl:choose>
               </xsl:otherwise>
           </xsl:choose>
        </li>
    </xsl:template>
</xsl:stylesheet>

ここで最大の変化が起こりました:

<xsl:apply-templates select="collection('./?select=*_ML.xml')//tei:persName[not(.=preceding-sibling::node())]">
    <xsl:sort select="string()" order="ascending"/>
</xsl:apply-templates>

ここでは、すべてのコンポーネント ファイルを選択するためのより良い方法を示します。XPath 関数collection('./?select=*_ML.xml')は、一致する作業パス内のすべてのファイルを選択し、その*_ML.xmlファイルのセットをノードのセットに変換します。次に、すべてのpersName要素のセットを選択します。

次に、異なるpersName要素のみを選択するために、述語: を適用しますnot(.=preceding-sibling::node())。この述語は、既に処理済みのノードと同一のコンテンツを持つすべてのノードを無視することを示しています。これにはノードが完全に等しい必要があるため、これが厳しすぎる場合は、ニーズに合わせて述語を変更できます。

この後、ノードをアルファベット順に昇順に並べ替えます。命令でこれを行うことが許可されていますapply-templates。複数のフィールドでソートする複数の命令を含めることもできsortます (もちろん、以下の select ステートメントを実際のステートメントに置き換える必要があります)。

<xsl:sort select="surname" order="ascending"/>
<xsl:sort select="rolename" order="ascending"/>
<xsl:sort select="forename" order="ascending"/>

私はそれがあなたが求めていたすべてだと思います...うーん...まあ、これがあります:

しかし、persName に時々現れる "Herr" や "Herrn" を削除する方法がわかりません。それを行う方法を知っていますか?

これが何を意味するのか 100% 確信が持てないので、例を示してください。それが想定されていないように見えることがあるのはいつですか?

PSこれが私のテストからの出力例であり、それが機能していることを示しています:

から

**01_ML.xml:**
<persName xmlns="http://uri.com/goes/here" role="addressee">Herr <roleName>Prof. Dr.</roleName>XYY</persName>

**02_ML.xml:**
<TEI xmlns="http://uri.com/goes/here">
    <persName key="linktodatabank">Herr <roleName>Dr.</roleName> Hugo <surname>Muller</surname></persName>

    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Herr Heinz</persName>
    <persName>Volkm</persName>
</TEI>

<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml" xmlns:tei="http://uri.com/goes/here">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <link rel="stylesheet" type="text/css" href="persName.css" />
      <title>Personenregister</title>
   </head>
   <body>
      <h1 class="title">Personenregister</h1>
      <ul>
         <li class="liste"><a href="linktodatabank" target="_blank">Herr Hugo Muller, Dr.</a></li>
         <li class="liste">Herr Heinz</li>
         <li class="liste">Herr XYY, Prof. Dr.</li>
         <li class="liste">Volkm</li>
      </ul>
   </body>
</html>
于 2013-10-18T16:10:41.060 に答える