XSLT:Как справиться с проверкой значения элемента?

StackOverflow https://stackoverflow.com/questions/1781873

  •  21-09-2019
  •  | 
  •  

Вопрос

У меня есть XML-файл, в котором есть тег, а именно: <Gender/>. Он содержит в качестве данных либо «M», либо «F», теперь моя работа — проверить значение и написать <Gender_Tag>Male</Gender_Tag> или <Gender_Tag>Female</Gender_Tag> по значениям M или F соответственно..Я попробовал этот код..Раньше работало при других обстоятельствах..

Это было полезно?

Решение

Все относительные пути, выраженные в шаблоне, сравниваются с текущим узлом.Ваш шаблон соответствует гендерным элементам, поэтому Пол = 'М' возвращает true, если таковой имеется Пол ребенок с именем «Пол» и значением «М».Я думаю, это не тот случай...

Используйте точку, чтобы обозначить текущий узел (здесь элемент Gender):

<xsl:template match="root/details/Gender">
  <Gender_Tag>  
    <xsl:choose>
      <xsl:when test=".='M'">
        <xsl:text>Male</xsl:text>
      </xsl:when>
      <xsl:otherwise>
       <xsl:text>Female</xsl:text>
      </xsl:otherwise>
    </xsl:choose>
  </Gender_Tag>
</xsl:template>

РЕДАКТИРОВАТЬ:Вы также можете использовать два шаблона

<xsl:template match="root/details/Gender[.='M']">
  <Gender_Tag>Male</Gender_Tag>
</xsl:template>
<xsl:template match="root/details/Gender[.='F']">
  <Gender_Tag>Female</Gender_Tag>
</xsl:template>

Другие советы

Непроверено, но может сработать...

<xsl:template match="root/details/Gender">
  <xsl:if test="text()='M'">
    <Gender_Tag>Male</Gender_Tag>
  </xsl:if>
  <xsl:if test="text()='F'">
    <Gender_Tag>Female</Gender_Tag>
  </xsl:if>
</xsl:template>
<xsl:template match="root/details/Gender">
    <xsl:choose>
        <xsl:when test="normalize-space(text())='M'">
            <Gender_Tag>Male</Gender_Tag>
        </xsl:when>
        <xsl:otherwise>
            <Gender_Tag>Female</Gender_Tag>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Мой пример отличается от примера Scoregraphic по двум пунктам:

  1. Он использует xsl:choose, чтобы гарантировать, что создается только один элемент Gender_Tag (это также означает, что если текст не «M», это всегда женский элемент).

  2. Использование normalize-space() удаляет пустое пространство вокруг текстового содержимого элемента.

Не видя XML, трудно быть уверенным, но я думаю, что ваш образец XSLT должен быть таким:

<xsl:template match="root/details/Gender">    
   <xsl:if test=".='M'">
      <Gender_Tag><xsl:text>Male</xsl:text></Gender_Tag>
   </xsl:if>
   <xsl:if test=".='F'">
      <Gender_Tag><xsl:text>Female</xsl:text></Gender_Tag>
   </xsl:if>
</xsl:template>

Было бы лучше использовать выбор в соответствии с другим ответом (хотя я думаю, что это должно быть два явных предложения «когда», а не «когда» и «иначе»)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top