XSLT: условный атрибут Обработка значения - PullRequest
2 голосов
/ 11 июля 2009

Следующее не работает должным образом:

<xsl:template match="xs:complexType">
  <xsl:param name="prefix" />

  <xsl:if test="$prefix='core'">
    <xsl:variable name="prefix" select=""/>
  </xsl:if>

  <xs:complexType name="{concat($prefix, @name)}">
    <xsl:apply-templates select="node()" />
  </xs:complexType>
  <xsl:apply-templates select=".//xs:element" />
</xsl:template>

Идея состоит в том, что если значение переменной префикса равно «core», я не хочу, чтобы оно добавлялось в значение атрибута name. Любое другое значение, я бы хотел добавить. IE:

<xs:complexType name="coreBirthType">

... является не приемлемым, в то время как следующее будет:

<xs:complexType name="BirthType">

Но я должен допустить, чтобы это произошло:

<xs:complexType name="AcRecHighSchoolType">

Я пробовал это в блоке, но Саксон жалуется, что не нашел закрывающий узел:

<xsl:choose>
  <xsl:when test="starts-with(.,'core')">
    <xs:complexType name="{@name)}">
  </xsl:when>
  <xsl:otherwise>
    <xs:complexType name="{concat($prefix, @name)}">
  </xsl:otherwise>
</xsl:choose>
  <xsl:apply-templates select="node()" />
</xs:complexType>

Какой лучший способ справиться с этим?

Ответы [ 2 ]

5 голосов
/ 11 июля 2009

В XSLT, как чистом языке без побочных эффектов, переменные являются неизменяемыми. Вы не можете изменить значение переменной. Если вы объявляете другую <xsl:variable> с тем же именем, вы определяете новую переменную, которая затеняет старую.

Вот как вы можете это сделать:

<xsl:param name="prefix" />

<xsl:variable name="prefix-no-core">
  <xsl:if test="$prefix != 'core'">
    <xsl:value-of select="$prefix" />
  </xsl:if>
</xsl:variable>

<xs:complexType name="{concat($prefix-no-core, @name)}">
...
1 голос
/ 11 июля 2009

Ну, вы можете использовать if внутри переменной; но в этом случае я думаю, что я бы попробовал <xsl:attribute>:

<xs:complexType>
   <xsl:attribute name="name"><xsl:if test="$prefix != 'core'"><xsl:value-of select-"$prefix"/></xsl:if><xsl:value-of select="@name"/></xsl:attribute>
   <!-- etc -->
</xs:complexType>

подход if:

<xsl:variable name="finalPrefix"><xsl:if test="$prefix != 'core'"><xsl:value-of select="$prefix"/></xsl:if></xsl:variable>
...
<xs:complexType name="{$finalPrefix}{@name}">
  <!-- etc -->
</xs:complexType>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...