Вам нужно изменить способ обработки 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. Это не повредит, но и не очень поможет.