Я начал исследовать основные изменения в XSLT 3.0. Насколько я знаю, в XSLT 2.0 мы не можем создать глобальную переменную для использования в разных шаблонах.
С помощью режима Streaming в XLST 3.0 и функции xsl: iterate или функции высшего порядка или некоторых других способностей мы теперь можем «запоминать» значения из предыдущих функций и, следовательно, мы можем использовать значения в разных местах над и снова.
Мой вопрос основан на следующем простом примере:
<?xml version="1.0" encoding="UTF-8"?>
<PERSONAE PLAY="OTHELLO">
<TITLE>Dramatis Personae</TITLE>
<PERSON>
<NAME>DUKE OF VENICE</NAME>
<ID>123456</ID>
<PROPERTIES>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</PERSON>
<PERSON>
<NAME>BRABANTIO, a senator.</NAME>
<ID>123456</ID>
<PROPERTIES>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</PERSON>
<PERSON>
<NAME>Other Senators.</NAME>
<ID>123456</ID>
<PROPERTIES>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</PERSON>
</PERSONAE>
Допустим, это мой пример xml, и я хочу изменить эти значения с помощью уникальных идентификаторов, сгенерированных java: util function
XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:util="java:java.util.UUID"
version="3.0" expand-text="yes">
<xsl:strip-space elements="PERSONAE"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:call-template name="birthdayTemplate"/>
</xsl:template>
<xsl:template match="PERSONAE">
<html>
<head>
<title>The Cast of {@PLAY}</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="TITLE">
<h1>{.}</h1>
</xsl:template>
<xsl:template match="PERSON/NAME[count(tokenize(., ',') = 2)]">
<p><b>{substring-before(., ',')}</b>: {substring-after(., ',')}</p>
</xsl:template>
<xsl:template match="PERSON/NAME">
<p>
<b>{.}</b>
</p>
</xsl:template>
<xsl:template match="PERSON/ID">
<p>
<xsl:value-of select="util:toString(util:randomUUID())"/>
</p>
</xsl:template>
<xsl:template match="PERSON/PROPERTIES"></xsl:template>
<xsl:template name="birthdayTemplate">
<xsl:for-each select="PERSON/PROPERTIES">
<PROPERTIES>
<ID>THE UUID VALUE THAT IS CREATED IN THE RESULT DOCUMENT</ID>
</PROPERTIES>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Результат, который я хочу получить:
<html xmlns:util="java:java.util.UUID">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The Cast of OTHELLO</title>
</head>
<body>
<h1>Dramatis Personae</h1>
<p><b>DUKE OF VENICE</b></p>
<p>a6759c7b-ff13-4b27-b726-ecd6ebaea96c</p>
<p><b>BRABANTIO, a senator.</b></p>
<p>1a58c699-ee9e-4093-8224-5319127fbf8c</p>
<p><b>Other Senators.</b></p>
<p>482908c6-2437-406d-a421-c7d2a103aba7</p>
<p>
<PROPERTIES>
<ID>a6759c7b-ff13-4b27-b726-ecd6ebaea96c</ID>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</p>
<p>
<PROPERTIES>
<ID>1a58c699-ee9e-4093-8224-5319127fbf8c</ID>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</p>
<p>
<PROPERTIES>
<ID>482908c6-2437-406d-a421-c7d2a103aba7</ID>
<BIRTHDAY>10.10.1980</BIRTHDAY>
<CITY>New York</CITY>
<COUNTRY>US</COUNTRY>
</PROPERTIES>
</p>
</body>
</html>
Как вы можете видеть из примера xml, идентификаторы узлов PERSON одинаковы, чтобы решить эту проблему, я решил использовать генератор случайных uuid для предоставления разных идентификаторов всем узлам лиц, поэтому их можно было бы идентифицировать однозначно.
Мое другое намерение - создать еще один шаблон для различных свойств узла PERSON и связать эти свойства с одним и тем же уникальным идентификатором.
Вопрос в том, существует ли какой-либо способ в XSLT 3.0 (или, если в XSLT 2.0, но приоритет 3.0,) прочитать эти случайные uuid перед их отображением (или я не знаю, как он обрабатывается) и использовать то же самое. значения в разных местах относительно рекурсивного сопоставления?
РЕДАКТИРОВАТЬ: Я исправил проблему, создав еще одно преобразование XSLT, которое просто изменяет значения со случайными UUID, а затем во втором преобразовании я копирую значения. Что, если это возможно в одном единственном преобразовании с XSLT 3.0 в режиме потоковой передачи? или же ? или что-то другое? Я понимаю ваш ответ @ Томалак, но я просто хочу знать, существует ли какой-либо другой способ решить эту проблему?