Есть ряд других вопросов, связанных с этой областью, но я не могу заставить их работать.
У меня есть преобразование, которое разбивает файл bean-компонента Spring, содержащий несколько bean-компонентов, на набор файлов, каждый из которых содержит один bean-компонент.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/beans/bean" xml:space="preserve">
<xsl:result-document href='{translate(normalize-space(./property[@name="name"])," ", "_")}.xml'
doctype-public="-//SPRING//DTD BEAN//EN"
doctype-system="http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<xsl:copy-of select="."/>
</beans>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Это отлично работает, создавая файлы, которые начинаются так:
<!DOCTYPE beans
PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean class="com.class.mine.Policy" name="bean1">
<property name="name">
Чтобы файл выглядел идентично файлу, изначально созданному только с одним bean-компонентом (поскольку файл будет проверен в управлении исходным кодом, мне нужны только реальные различия), я хочу изменить атрибут name="beanN"
на name="bean0"
в каждом файле. Обратите внимание, что обычно тег bean-компонента может содержать дополнительные атрибуты, а также атрибуты class
и name
.
Ничто из того, что я пробовал на основе других ответов, здесь не работает. В основном я получаю сообщения об ошибках «Невозможно создать узел атрибута, родительским элементом которого является узел документа» и «Невозможно создать узел атрибута после создания дочернего элемента содержащего элемента».
Так что я упускаю что-то очевидное. Что мне нужно добавить, чтобы внести это дополнительное изменение?
Обновление: проблема частично связана с xml:space="preserve". Это предположительно вызывает создание текстовых узлов. Когда это удалено, я не так часто получаю ошибки, но я все еще не могу правильно преобразовать
(и на выходе есть
<beans><bean>
Как сделать перевод строки между этими тегами? Я могу использовать indent="yes" для форматирования вывода, но я действительно хочу сохранить исходный формат ввода, внося изменения только там, где мне нужно)
Обновление: одна из моих многочисленных попыток. Этот работает, но в основном представляет собой преобразование личности. result-doc закомментирован, чтобы упростить отладку. Я действительно не совсем понимаю, как работает xsl:attribute, поэтому достойное объяснение может помочь.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="beans/bean">
<!-- <xsl:result-document href='{translate(normalize-space(./property[@name="name"])," /", "_+")}.xml'
doctype-public="-//SPRING//DTD BEAN//EN"
doctype-system="http://www.springframework.org/dtd/spring-beans.dtd"
omit-xml-declaration="no"> -->
<beans>
<xsl:apply-templates select="bean"/>
<xsl:copy-of select="." />
</beans>
<!-- </xsl:result-document> -->
</xsl:template>
<xsl:template match="bean/@*">
<xsl:copy>
<xsl:attribute name="name">myvalue</xsl:attribute>
<xsl:copy-of select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>