还有许多其他问题涉及这个领域,但我无法使解决方案有效
我有一个转换,它将包含多个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>
答案 0 :(得分:2)
如果您需要特定缩进,则必须自己插入相关的换行符和空格:
<?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"/>
<xsl:template match="/">
<xsl:apply-templates select="beans/bean" />
</xsl:template>
<xsl:template match="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">
<xsl:text> </xsl:text><!-- newline after the DOCTYPE -->
<beans>
<xsl:text> </xsl:text><!-- newline and four spaces -->
<bean>
<xsl:copy-of select="@*" />
<xsl:attribute name="name">bean0</xsl:attribute>
<xsl:copy-of select="node()" />
</bean>
<xsl:text> </xsl:text><!-- newline between </bean> and </beans> -->
</beans>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
重命名:
<bean>
<xsl:copy-of select="@*" />
<xsl:attribute name="name">bean0</xsl:attribute>
<xsl:copy-of select="node()" />
</bean>
首先我将所有属性(可能包括name
)复制到原始bean
标记之外,然后创建一个(nother)name
属性,该属性将覆盖已复制的属性,然后最后复制原始bean
元素的所有子节点(包括元素,注释和文本节点,因此将保留原始缩进)。