Использование элемента apply-templates для выбора и ввода значений по параметрам

Я пытаюсь понять фрагмент кода XSLT для рабочего проекта, но я просто не могу понять, что вызывает, что и как правильно передаются значения.

У меня есть этот код, который использует элемент apply-templates для выбора первого элемента в элементе типа документа:

<xsl:apply-templates select="DocumentType[string(text())][1]" mode="XmlString">
        <xsl:with-param name="name" select="'DocumentType'"/>
      </xsl:apply-templates>

Затем в шаблон передается параметр, который присваивает правильное значение. Атрибут name в with-param соответствует элементу param здесь:

<xsl:template match="*" mode="XmlString">
    <xsl:param name="name"/>
    <!-- Check the "name" parameter : madantory / optional -->
    <xsl:call-template name="MandatoryOrOptional">
      <xsl:with-param name="name" select="$name"/>
      <xsl:with-param name="value" select="."/>
    </xsl:call-template>
  </xsl:template>

Но я не уверен, почему и как это значение передается. Это многократно используется на карте всякий раз, когда необходимо сопоставить значение.

Обычно я просто создавал необходимые теги и использовал элемент xsl: value-of, чтобы получить желаемое значение из исходного документа. Если бы кто-нибудь мог просветить меня относительно того, как этот код работает на практике, я был бы признателен. Несколько раз я использовал apply-templates, я уже определил шаблон в своем XSLT, а затем использовал атрибут match для его применения.


person Leth    schedule 19.03.2018    source источник
comment
Это не то, что сделал бы Дизайнер. Это шаблон, который вам действительно нужно воспроизвести? Возможно, первоначальный разработчик пытался быть слишком умным, чтобы за ним мог последовать кто-либо другой. :(   -  person Johns-305    schedule 20.03.2018
comment
Что вы имеете в виду под первым утверждением? Да, я хотел бы воспроизвести этот шаблон, если это возможно, поскольку он широко используется.   -  person Leth    schedule 20.03.2018
comment
Я имею в виду, что BizTalk Mapper этого не сделает.   -  person Johns-305    schedule 20.03.2018


Ответы (1)


Этот метод (то есть передача чего-либо через несколько шаблонов) полезен, если мы считаем, что apply-template аналогичен for-each. В этом сравнении with-param аналогичен переменной.

Если вам нужно передать переменную через несколько шаблонов, вы можете сделать это с помощью метода, который вы видите. Поскольку значение, присвоенное параметру «имя» в XMLString, выходит за рамки при вводе MandatoryOrOptional, вам нужен способ указать, что такое «имя», когда вы вводите шаблон MandatoryOrOptional. Для этого нужно передать «имя» в качестве параметра. Эффективное расширение области действия переменной в новом шаблоне.

Я добавил комментарии к вашему фрагменту кода, чтобы попытаться детализировать это «в коде».

<xsl:template match="*" mode="XmlString">
    <xsl:param name="name"/> 
        <!--This brings the name from the first template and stores it -->
        <!--This is treated as a variable with a scope of the template -->
    <xsl:call-template name="MandatoryOrOptional">
      <xsl:with-param name="name" select="$name"/>
         <!-- This effectively expands the scope of the variable $name -->
         <!-- The name sent from the first template is now in scope for MandatoryOrOptional -->
      <xsl:with-param name="value" select="."/>
    </xsl:call-template>
</xsl:template>

Спорный вопрос о том, является ли хорошей практикой сохранять name = "name" для каждого параметра, но я думаю, что это имеет смысл, и я использовал его несколько раз. Это упрощает отслеживание «переменной» в коде.

person Jason H    schedule 23.03.2018