我一直在寻找这个解决方案,在我放弃之前我想我试着在这里问这个问题。
我有 27 个 XML 文件(在 TEI 中),我有一个 XSLT 样式表 2.0。我编写了一个函数,该函数进入每个 XML 文件并创建一个(一个)新的 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 等。我知道有一个计数器会很好,但不知道该怎么做。在我为所有文档命名之后(我对提取地点名称和术语做同样的事情),我创建了一个集合(也不是一个好的解决方案)并像这样尝试它:
<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”。你知道怎么做吗?
另一件事是,我想删除所有双重名称。有些名字出现不止一次。
我的新 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”(先生)的东西:我只想有姓氏,名字和头衔,但没有先生或夫人(Herr)。所以我想删除“Herr”,只要它出现在我的 persName 中