Я успешно создал шаблон XSLT для копирования некоторых элементов, смены имен некоторых элементов, из одного файла XML в другой.Переместить элементы в другое место с помощью XSLT
Я не могу понять, как взять элементы и переместить их в другую часть структуры XML.
Я хочу, чтобы преобразовать этот XML:
<Hosts>
<Clusters>
<Cluster>
<Nodes>
<WindowsHost/>
</Nodes>
</Cluster>
</Clusters>
</Hosts>
к:
<Hosts>
<WindowsHosts>
<WindowsHost/>
</WindowsHosts>
</Hosts>
Мой текущий рабочий XSLT содержит:
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
... а затем повторяющиеся шаблоны, как:
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Hosts/Clusters/Cluster/Nodes/WindowsHost/SomeElement">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
и так далее. Каждый элемент, который нужно скопировать, имеет свой собственный шаблон, поскольку не все элементы скопированы, а некоторые имена элементов изменены. Но мне удалось изменить имя элемента, а не полный XPath.
Любая помощь будет оценена по достоинству.
Пол
Ваш ответ очень ценится. Но я думаю, что мой пример был слишком простым, пытаясь быть ясным.
В моем существующем XSLT есть шаблон для каждого элемента, который необходимо скопировать из одного XML в другой, поэтому существует множество шаблонов (почти 1000), а начало файла XSLT гарантирует, что с каким-либо элементом по умолчанию ничего не происходит , Короче говоря, я пробовал методы в вашем ответе без успеха, возможно потому, что ситуация не совсем такая, как я показал вам.
Есть три сценария элементов копируются:
- Копировать как
- Copy, но изменить имя элемента
- Копировать в другое место в схеме
Существующее Файл XSLT работает как с # 1, так и с # 2. Это №3, я не могу работать. Вот несколько из XSLT файл
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="/SAN/ClientProfile">
<!-- copy element as is (working) -->
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/SAN/ClientProfile/Name">
<!-- copy element but change its name (working) -->
<CompanyName>
<xsl:apply-templates/>
</CompanyName>
</xsl:template>
<xsl:template match="/SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost">
<!-- copy to different part of schema (not working) -->
<WindowsHost>
<xsl:apply-templates/>
</WindowsHost>
</xsl:template>
Итак, я хочу, чтобы изменить /SAN/EQLHosts/WindowsClusters/Cluster/ClusterNodes/WindowsHost
к /SAN/EQLHosts/WindowsHosts/WindowsHost
. Все дети этого элемента будут обрабатываться так же, как и те элементы, которые уже скопированы.
Надеюсь, мои разъяснения ясны. Пожалуйста, дайте мне знать, если эта информация изменит ваш ответ или я просто плотный.
Paul
Ваш отзыв очень ценится. Я добавил дополнительную информацию в свой первоначальный пост. –