Встраивание тегов в xslt

У меня есть этот xslt, который работает:

<xsl:when test="area_of_expertise">
 <div>
 <xsl:value-of select="area_of_expertise">
 </xsl:value-of></div>
</xsl:when>

но то, что мне нужно, соответствует строкам:

<xsl:when test="area_of_expertise">
 <div id="<xsl:value-of select=" area_of_expertise"="">">
 <xsl:value-of select="area_of_expertise">
 </xsl:value-of></div>
</xsl:when>

Однако во втором примере есть ошибки.. кто-нибудь знает почему?

Btw Есть ли способ преобразовать имя node area_of_expertise в areaOfExperiseLabel и вставить это как id? вывод, который мне действительно нужен, это:

<div id="areaOfExpertiseLabel">
 asasdasdasd
</div>
5 ответов

Для второй части попробуйте использовать этот шаблон:

<xsl:template name="parse">
 <xsl:param name="input">
 <xsl:param name="position">
 <xsl:if test="$position <= string-length($input)">
 <xsl:choose>
 <xsl:when test="substring($input, $position, 1) = '_'">
 <xsl:value-of select="translate(substring($input, $position + 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')">
 <xsl:call-template name="parse">
 <xsl:with-param name="input" select="$input">
 <xsl:with-param name="position" select="$position + 2">
 </xsl:with-param></xsl:with-param></xsl:call-template>
 </xsl:value-of></xsl:when>
 <xsl:otherwise>
 <xsl:value-of select="substring($input, $position, 1)">
 <xsl:call-template name="parse">
 <xsl:with-param name="input" select="$input">
 <xsl:with-param name="position" select="$position + 1">
 </xsl:with-param></xsl:with-param></xsl:call-template>
 </xsl:value-of></xsl:otherwise>
 </xsl:choose>
 </xsl:if>
 </xsl:param></xsl:param></xsl:template>

Использование:

<xsl:call-template name="parse">
 <xsl:with-param name="input" select="'area_of_expertise'">
 <xsl:with-param name="position" select="1">
 </xsl:with-param></xsl:with-param></xsl:call-template>


Причина, по которой он ошибается, заключается в том, что он больше не является допустимым XML.

Чтобы сделать то, что вы пытаетесь сделать:

<xsl:when test="title">
 <div id="{title}">
 <xsl:value-of select="title">
 </xsl:value-of></div>
</xsl:when>

Вы можете поместить любой тип селектора внутри {} тегов или даже ссылочных переменных, если у вас что-то сложное.

<xsl:variable name="some_complex_variable">
 </xsl:variable>
<xsl:when test="title">
 <div id="{$some_complex_variable}">
 <xsl:value-of select="title">
 </xsl:value-of></div>
</xsl:when>

Третий, длинный способ сделать это - динамически присоединить атрибут с атрибутом xsl:

<xsl:when test="title">
 <div>
 <xsl:attribute name="id" select="title">
 </xsl:attribute></div>
</xsl:when>


Для второй части, перейдя от подчеркивания к случаю верблюда, вы можете посмотреть String Processing в стандартной библиотеке XSLT. С str:subst(), чтобы разделить на символы подчеркивания, str:to-camelcase(), чтобы изменить регистр букв соответственно, и concat(), чтобы добавить суффикс "Ярлык", вы должны быть установлены.


Для 1-й части вы можете использовать:

<xsl:when test="area_of_expertise">
 <div>
 <xsl:attribute name="id">
 <xsl:value-of select="area_of_expertise">
 </xsl:value-of></xsl:attribute>
 <xsl:value-of select="area_of_expertise">
 </xsl:value-of></div>
</xsl:when>


Это может быть глупый ответ, но кажется, что вам нужна эта простая трассировка:

<xsl:when test="area_of_expertise">
 <div id="areaOfExperiseLabel">
 <xsl:value-of select="area_of_expertise">
 </xsl:value-of></div>
</xsl:when>

В противном случае, почему вы участвуете в для @id, если вам нужна другая строка?

licensed under cc by-sa 3.0 with attribution.