Хитрость заключается в том, чтобы использовать шаблон идентификации , чтобы скопировать весь документ, но при этом иметь возможность изменять нужные части:
С этим (слегка измененным) входом:
<?xml version="1.0" encoding="UTF-8"?>
<Transaction xmlns:fun1="DocumentXML.com">
<Date>2010-10-14T12:06:12.164+01:00</Date>
<Production>NO</Production>
<Document fun1:OID="1.9.101106">
<DocumentType xmlns="">Monthly A</DocumentType>
<RangeName xmlns="">Range Name</RangeName>
<Name xmlns="">Equity</Name>
<Language xmlns="">English</Language>
<Class xmlns="">A Acc</Class>
<Active xmlns="">YES</Active>
<Country xmlns="">UK</Country>
<Country xmlns="">Luxembourg</Country>
<Country xmlns="">Denmark</Country>
<Country xmlns="">Malta</Country>
<Primary fun1:OID="1.9.101106" xmlns="" xmlns:fun1="DocumentXML.com">
<Name>SISF-Indian-Equity-A-Acc-FMR-UKEN</Name>
<FileSizeInKB>176784</FileSizeInKB>
<FileType>pdf</FileType>
<ReportingPeriod>September</ReportingPeriod>
<ReportingYear>2010</ReportingYear>
</Primary>
<Primary fun1:OID="1.9.101118" xmlns="" xmlns:fun1="DocumentXML.com">
<Name>SISF-Indian-Equity-A-Acc</Name>
<FileSizeInKB>176784</FileSizeInKB>
<FileType>pdf</FileType>
<ReportingPeriod>September</ReportingPeriod>
<ReportingYear>2010</ReportingYear>
</Primary>
</Document>
</Transaction>
Объяснение изменений во входном XML: Предоставленный входной XML недопустим, поскольку вы используете двойные кавычки для каждого атрибута. Кроме того, префикс fun
не объявлен для узла Document
. Я изменил префикс fun
на fun1
и привязал префикс на корневом уровне.
И эта таблица стилей:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<!-- This identity template copies the document -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- This template will only match the 'Primary' nodes
and modify them the way you want. -->
<xsl:template match="Primary">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
<!-- As you can see, this is the only difference
between the identity template and this specific
template. -->
<xsl:copy-of select="../Country"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Даст вам идентичный документ, но с копией Country
в Primary
:
<?xml version="1.0" encoding="UTF-8"?>
<Transaction xmlns:fun1="DocumentXML.com">
<Date>2010-10-14T12:06:12.164+01:00</Date>
<Production>NO</Production>
<Document fun1:OID="1.9.101106">
<DocumentType>Monthly A</DocumentType>
<RangeName>Range Name</RangeName>
<Name>Equity</Name>
<Language>English</Language>
<Class>A Acc</Class>
<Active>YES</Active>
<Country>UK</Country>
<Country>Luxembourg</Country>
<Country>Denmark</Country>
<Country>Malta</Country>
<Primary fun1:OID="1.9.101106">
<Name>SISF-Indian-Equity-A-Acc-FMR-UKEN</Name>
<FileSizeInKB>176784</FileSizeInKB>
<FileType>pdf</FileType>
<ReportingPeriod>September</ReportingPeriod>
<ReportingYear>2010</ReportingYear>
<Country>UK</Country>
<Country>Luxembourg</Country>
<Country>Denmark</Country>
<Country>Malta</Country>
</Primary>
<Primary fun1:OID="1.9.101118">
<Name>SISF-Indian-Equity-A-Acc</Name>
<FileSizeInKB>176784</FileSizeInKB>
<FileType>pdf</FileType>
<ReportingPeriod>September</ReportingPeriod>
<ReportingYear>2010</ReportingYear>
<Country>UK</Country>
<Country>Luxembourg</Country>
<Country>Denmark</Country>
<Country>Malta</Country>
</Primary>
</Document>
</Transaction>