У меня есть xml-структура, которая выглядит примерно так:
<Page>
<Id>Page1</Id>
<Content>
<Header>This is the Header</Header>
<Body>This is the body</Body>
<Nested>
<NestedItem>
<Id>N1</Id>
<Content>This is a nested element</Content>
</NestedItem>
<NestedItem>
<Id>N2</Id>
<Content>This too is a nested element</Content>
</NestedItem>
</Nested>
</Content>
<Localizations>
<Localization>
<Locale>ES</Locale>
<Content>
<Header>Esta un caballo</Header>
<Body>Esta body</Body>
<Nested>
<NestedItem>
<Id>N2</Id>
<Content>Esta una element nestado</Content>
</NestedItem>
</Nested>
</Content>
<Localization>
</Localizations>
</Page>
и после xslt-преобразования, в которое я передаю переменную "ES", в данном случае я хочу, чтобы она выгляделачто-то вроде этого:
<Page>
<Id>Page1</Id>
<Content>
<Header>Esta un caballo</Header>
<Body>Esta body</Body>
<Nested>
<NestedItem>
<Id>N1</Id>
<Content>This is a nested element</Content>
</NestedItem>
<NestedItem>
<Id>N2</Id>
<Content>Esta una element nestado</Content>
</NestedItem>
</Nested>
</Content>
</Page>
т.е. я хочу перевести элементы, имеющие соответствующие элементы в локализацию, но сохранить исходный текст там, где есть оригинальный текст.Дело в том, что структура элемента содержимого может быть неизвестна, поэтому я не могу использовать определенные имена тегов в xsl-файле.
пока, я пришел с этим:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:param name="locale"></xsl:param>
<xsl:template match="/" name="foo">
<xsl:for-each select="./*">
<xsl:if test="name() != 'Localizations'">
<xsl:element name="{name()}">
<xsl:variable name="elementName" select="name()"/>
<xsl:variable name="elementId" select="Id"/>
<xsl:variable name="elementContent">
<xsl:value-of select="./text()" />
</xsl:variable>
<xsl:variable name="localContent">
<xsl:for-each select="./ancestor::Page[1]/Localizations/Localization">
<xsl:if test="./Locale = $locale">
<xsl:copy-of select="*[name()=$elementName]/*"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:copy-of select="$localContent"/>
<xsl:call-template name="foo"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
, который выводит xml в порядке, но он создает дубликаты элементов в теге содержимого и только испанский контентостальные теги остаются пустыми.Я вообще правильно иду по этому поводу?Любые указатели будут оценены, справочники по xslt довольно сложно найти, и я пытаюсь научить себя здесь ...