XSLT:添加名称空间,复制内容,更改复制内容的值

时间:2018-06-05 09:14:30

标签: java xml xslt

我有一个XML我想做一些我似乎无法在Java中工作的转换。下面我提供了输入,所需的输出和我的尝试。我不知道我在这里做错了什么,感谢任何帮助。

总结一下,我想基本上做三个转换:

  1. 添加新命名空间的声明。
  2. 更改版本号。
  3. 将某些元素移动到新的命名空间中。
  4. 我的猜测是我复制时出了点问题。也许在复制后我会覆盖一些东西。

    这是我的意见:

    <section class="stage" >
        <figure class="circle ball" id="1"><span class="shadow"></span></figure> 
    </section>
    <section class="stage" >
        <figure class="circle ball" id="2"><span class="shadow"></span></figure>
    </section>
    <section class="stage" >
        <figure class=" circle ball" id="3"><span class="shadow"></span></figure>
    </section>

    这是我想要的输出:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Structure xmlns="http://www.example.com/xsd/Structure"
                                version="2.0"
                                name="myName">
    
      <Graph name="test">
    
        <Vertices>
          <Vertex name="n1" kind="input"/>
          <Vertex name="n2" kind="output"/>
        </Vertices>
    
        <Edges>
          <Edge start="n1" end="n2">
            <Transformation>
              <Entry entry="1"/>
            </Transformation>
          </Edge>
        </Edges>
    
      </Graph>
    
    </Structure>
    

    这是我的XSLT:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Structure xmlns:cs="http://www.example.com/xsd/ControlStructure"
    xmlns="http://www.example.com/xsd/Structure" version="3.0"
    name="myName">            <--- Declared name space and changed version
    
      <Graph name="test">
    
        <Vertices>
          <Vertex name="n1" kind="input"/>
          <Vertex name="n2" kind="output"/>
        </Vertices>
    
        <Edges>
          <Edge start="n1" end="n2">
            <cs:Transformation>                 <--- Added name space
              <Entry entry="1"/>
            </cs:Transformation>                <--- Added name space
          </Edge>
        </Edges>
    
      </Graph>
    
    </Structure>
    

1 个答案:

答案 0 :(得分:0)

您已经有一个参数cs绑定到新命名空间,您没有使用它。目前尚不清楚您是否真的希望新命名空间成为运行时参数,或者它是否可以进行硬编码。如果您希望它是一个参数,那么最好的办法是切换到XSLT 2.0处理器并使用xsl:namespace。

否则,你就是在正确的路线上。

您更改版本属性的模板无效,因为它永远不会触发:因为您的Structure元素模板不会更改属性,而是应用模板。

在指令<xsl:element name="cs:{local-name()}">中,您应添加namespace属性以定义新的命名空间URI。否则它会查找前缀&#34; cs&#34;的绑定。在样式表中,并没有一个。它在结果树中具有绑定是不够的。