Я пытаюсь что-то очень простое, но по какой-то причине это не работает. По сути, мне нужно переименовать некоторые узлы в документе XML. Таким образом, я создал XSLT-файл для преобразования.
Вот пример XML:
РЕДАКТИРОВАТЬ: Адреса и элементы адреса встречаются на многих уровнях. Это то, что заставило меня попытаться применить XSLT. Функция типизированных наборов данных Visual Studio, которая создает типизированные наборы данных из файлов XSD, не позволяет иметь вложенные ссылки на одну и ту же таблицу. Таким образом, наличие Бизнес / Бизнес / Адреса и Бизнес / Бизнес / Контакт / Адреса приводит к сбою Load (). Это известная проблема, и все, что они говорят вам, это что-то вроде «Не иметь вложенных ссылок на таблицы ... отредактируйте свой XSD, чтобы прекратить иметь это». К сожалению, это означает, что мы должны применить XSLT, чтобы XML соответствовал «взломанному» XSD, поскольку файлы поступают от стороннего поставщика.
Итак, мы очень близки с помощью, оказанной здесь. Последняя пара вещей такова:
1.) Как я могу использовать ссылку на пространство имен в атрибуте соответствия шаблона xsl:, чтобы указать, что я хочу переименовать Бизнес / Бизнес / Адреса в BusinessAddresses, но переименовать Бизнес / Бизнес / Контакты / Контакт / Адреса связаться с адресами?
2.) Как я могу помешать XSLT загромождать каждый новый элемент явными ссылками на пространство имен? Это вызывает чрезмерное вздутие на выходе.
Я создал пространство имен под названием «steel» и добился большого успеха:
<xsl:template match="steel:Addresses>
<xsl:element name="BusinessAddresses>
</xsl:template>
Очевидная проблема здесь заключается в том, что он переименовывает ALL элементов Addresses в BusinessAddresses, хотя я хочу, чтобы некоторые из них назывались ContactAddresses и так далее. Бесполезное добавление явных ссылок на пространство имен ко всем переименованным узлам также создает проблемы.
Я пробовал подобные вещи, но как только я добавляю косые черты в атрибут match, это синтаксическая ошибка в XSLT, например:
<xsl:template match="steel:/Businesses/Business/Addresses">
Я чувствую себя очень близко, но мне нужно несколько советов о том, как смешать использование пространства имен и способ использования косой черты для выбора ЛЮБЫХ узлов под определенными путями.
<?xml version="1.0"?>
<Businesses>
<Business>
<BusinessName>Steel Stretching</BusinessName>
<Addresses>
<Address>
<City>Pittsburgh</City>
</Address>
<Address>
<City>Philadelphia</City>
</Address>
</Addresses>
<Contacts>
<Contact>
<FirstName>Paul</FirstName>
<LastName>Jones</LastName>
<Addresses>
<Address>
<City>Pittsburgh</City>
</Address>
</Addresses>
</Contact>
</Contacts>
</Business>
<Business>
<BusinessName>Iron Works</BusinessName>
<Addresses>
<Address>
<City>Harrisburg</City>
</Address>
<Address>
<City>Lancaster</City>
</Address>
</Addresses>
</Business>
</Businesses>
Мне нужно переименовать адреса в BusinessAddresses, и мне нужно переименовать адрес в BusinessAddress для каждого экземпляра адресов и адресов непосредственно в бизнес-узле. Мне также нужно переименовать адреса в ContactAddress, и мне нужно переименовать адрес в ContactAddress, для каждого экземпляра адресов и адресов непосредственно под контактным узлом.
Я пробовал несколько решений, но ни одно из них не работает. Все они в конечном итоге создают тот же XML, что и исходный файл.
Вот пример того, что я пробовал:
<xsl:template match="/">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="@*|*">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="Addresses">
<BusinessAddresses>
<xsl:apply-templates select="@*|node()" />
</BusinessAddresses>
</xsl:template>
Это было опробовано, по крайней мере, в 6 различных вариантах, включая пошаговый отладчик XSLT в VB.Net. Он никогда не выполняет сопоставление шаблона для адресов.
Почему?