2

この領域を扱う質問は他にもたくさんありますが、解決策を機能させることはできません

複数の Bean を含む Spring Bean ファイルを、それぞれ 1 つの 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">

ファイルが 1 つの Bean だけで最初に作成されたファイルと同じに見えるようにするために (ファイルはソース コード管理にチェックインされるため、実際の違いだけが必要です)、各ファイルのname="beanN"属性をに変更したいと考えています。name="bean0"通常、bean タグには、classおよびの属性だけでなく、追加の属性を含めることができることに注意してくださいname

ここで他の回答に基づいて試したことはありません。ほとんどの場合、「親がドキュメント ノードである属性ノードを作成できません」および「包含要素の子を作成した後に属性ノードを作成できません」というエラーが表示されます。

だから私は明らかな何かを見逃しています。この追加の変更を行うには、何を追加する必要がありますか?

更新: 問題の一部は xml:space="preserve" に関係しているようです。これにより、おそらくテキスト ノードが作成されます。それを削除すると、エラーが頻繁に発生することはありませんが、変換を正しく行うことはできません

(そして出力は

<beans><bean>

これらのタグの間に改行を入れるにはどうすればよいですか? indent="yes" を使用して出力をフォーマットできますが、入力フォーマットを元のままにして、必要な場所だけを変更したいのです)

更新:私の多くの試みの1つ。これは実行されますが、基本的に恒等変換です。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>
4

1 に答える 1

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>&#10;</xsl:text><!-- newline after the DOCTYPE -->
      <beans>
        <xsl:text>&#10;    </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>&#10;</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タグからすべての属性 (おそらく を含む)nameをコピーし、コピーされたものをオーバーライドする (別の) 属性を作成し、最後に元の要素のすべての子ノードbean(要素、コメントテキストを含む) をコピーします。ノードなので、元のインデントが保持されます)。

于 2013-11-22T11:35:33.377 に答える