Копирование и добавление элементов (создание WSDL из XSD) - PullRequest
2 голосов
/ 13 октября 2010

Я генерирую WSDL из XSD с XSLT 2.0 и копирую схему непосредственно в WSDL, например:

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

Теперь я также хочу добавить некоторые типы в элемент schema, что является лучшим способом сделать это.

Я использую этот XSLT в качестве основы моей работы.

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Вам нужно изменить способ обработки 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 голос
/ 13 октября 2010

Просто используйте :

<!-- 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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...