Этот тип работает, но он ставит дефисы, даже если <subfield>
отсутствует - Нет условия для проверки, имеет ли элемент <subfield>
конкретное значение в атрибуте @code
присутствует во входном XML или нет. <xsl:if test="">
условие перед каждым <xsl:value-of>
обработало бы этот случай.
Однако существуют разные способы написания XSLT-кода для генерации требуемого HTML-вывода. Текущий код XSLT создаст один тег <p>
, содержащий все значения из элементов <subfield>
, которые, я считаю, не являются необходимыми. Я думаю, что вам понадобится отдельный тег <p>
, соответствующий каждому <datafield @tag='650'>
и имеющий отдельное значение hyphen
для дочерних элементов <subfield>
.
Для достижения этого результата шаблон должен быть изменен, как показано ниже.
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="record/datafield[@tag='650']">
<!-- create <p> tag for every <datafield> -->
<p>
<!-- instead of hardcoding <subfield> elements, loop through
the available <subfield> element having @code attribute -->
<xsl:for-each select="subfield[@code]">
<xsl:value-of select="." />
<!-- if the position of the <subfield> is not last
append hyphen characters to concatenated string -->
<xsl:if test="position() != last()">
<xsl:text>--</xsl:text>
</xsl:if>
</xsl:for-each>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
Это генерирует HTML, как показано ниже
<html>
<body>
<p>Anthropology--Southwest, New--Periodicals.</p>
<p>Indians of North America--Southwest, New--Periodicals.</p>
<p>Archaeology--Periodicals.</p>
<p>Anthropology.</p>
<p>Antiquities.--History.</p>
<p>Archaeology.</p>
<p>Indians of North America.</p>
</body>
</html>
Приведенный выше код XSLT является лишь одним из способов получения результата. Один и тот же XSLT может быть переписан / изменен с использованием различных подходящих шаблонов вместо вложенных <xsl:for-each>
или шаблонов, обрабатывающих конкретные значения @code
, т. Е. Если нужно учитывать только @code = 'a' or 'v' or 'x' or 'z'
, а любое другое значение игнорировать.