私は長い間この解決策を探していましたが、あきらめる前にここでこの質問をしようと思いました.
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」を削除したい