XSLT:Как справиться с проверкой значения элемента?
Вопрос
У меня есть 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 по двум пунктам:
Он использует xsl:choose, чтобы гарантировать, что создается только один элемент Gender_Tag (это также означает, что если текст не «M», это всегда женский элемент).
Использование
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>
Было бы лучше использовать выбор в соответствии с другим ответом (хотя я думаю, что это должно быть два явных предложения «когда», а не «когда» и «иначе»)