我使用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作为我工作的基线。
答案 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>