copy-of然后追加元素(从XSD生成WSDL)

时间:2010-10-13 10:44:07

标签: xslt wsdl

我使用XSLT 2.0从XSD生成WSDL,我将模式直接复制到WSDL中,如下所示:

    ....
    <!-- WSDL types  -->
    <xsl:template name="types">
        <wsdl:types>
            <xsl:copy-of select="/xsd:schema"/>
        </wsdl:types>
    </xsl:template>
    .... 

现在我还想在schema元素中附加一些类型,这是最好的方法。

using this XSLT作为我工作的基线。

2 个答案:

答案 0 :(得分:2)

您需要更改处理xsd:schema的方式。目前,您只是在进行直接复制,这使得无法更改xsd:schema节点的内容。

您需要做的是将xsl:copy-of更改为xsl:apply-templates。通过这样做,您可以通过编写适当的匹配模板以任何方式修改内容,同时只需使用身份模板复制您不想修改的内容:

<xsl:template match="@*|node()" mode="schema">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()" mode="#current"/>
  </xsl:copy>
</xsl:template>

最好,您可以使用mode进行处理,以确保只影响您想要的节点(请参阅帖子末尾的评论):

....
<!-- WSDL types  -->
<xsl:template name="types">
  <wsdl:types>
    <xsl:apply-templates select="/xsd:schema" mode="schema"/>
  </wsdl:types>
</xsl:template>
....

使用此设置与使用xsl:copy-of没有区别。但现在您可以轻松添加,更改或修改/xsd:schema的后代节点。例如,将孩子添加到xsd:schema可以很容易地完成:

<xsl:template match="xsd:schema" mode="schema">
  <xsl:copy>
    <!-- This will ensure further processing. -->
    <xsl:apply-templates select="@*|node()" mode="#current"/>
    <!-- Adds a child node to xsd:schema. -->
    <xsd:element name="...">
      ...
    </xsd:element>
  </xsl:copy>
</xsl:template>

我自己没有使用过WSDL,所以我希望我现在没有理解你了!


修改:抱歉,您不需要mode来简化处理。我读错了你的问题,虽然输入文件只是一个XSD的东西。它不会受到伤害,但也不会对你有所帮助。

答案 1 :(得分:1)

只需使用

<!-- WSDL types  --> 
<xsl:template name="types"> 
    <wsdl:types>
       <xsl:for-each select="/xsd:schema">
        <xsl:copy>
          <xsl:copy-of select="node()|@*"/>

          <!-- Add your additional types here, for example:  -->
          <xsl:copy-of select="$vMyNewTypes"/>
        <xsl:copy>
       </xsl:for-each> 
    </wsdl:types> 
</xsl:template>