2015-03-07 2 views
1

Я очень новичок в Xpath и борюсь с некоторыми функциями. Вот базовая версия XML-файла. Я хочу изменить идентификатор на атрибут, а затем изменить букву B на число. Я пишу вывод как XML.Я пытаюсь сменить буквы (ABC) на числа (123) в xpath

<artists> 
    <artist> 
    <id>B</id> 
    <name>John Sunday</name> 
    </artist> 
</artist> 

Вот что я сделал в моей XSL:

<xsl:template match="artist"> 
    <artist> 
    <xsl:attribute name="id"> 
     <xsl:apply-templates select="id"/> 
    </xsl:attribute> 
    <name><xsl:value-of select="name"/></name> 
    </artist> 

<xsl:template match="id"> 
    <xsl:value-of select="translate('BCD','BCD','123')"/> 
</xsl:template> 

, а затем получить следующий вывод:

<artist id="123"> 
<name>John Sunday</name> 
</artist> 

, где я просто хочу, чтобы это было:

<artist id="1"> 
<name>John Sunday</name> 
</artist> 

, а затем следующий художник, являющийся «2»,

ответ

2

Просто изменить

<xsl:template match="id"> 
    <xsl:value-of select="translate('BCD','BCD','123')"/> 
</xsl:template> 

в

<xsl:template match="id"> 
    <xsl:value-of select="translate(.,'BCD','123')"/> 
</xsl:template> 

Как соответствует вашему шаблону в id, то . является текущим значением id.

Если это применяется к пример входного XML генерируется

<artists> 
    <artist> 
    <id>B</id> 
    <name>John Sunday</name> 
    </artist> 
    <artist> 
    <id>C</id> 
    <name>John Monday</name> 
    </artist> 
    <artist> 
    <id>D</id> 
    <name>John Tuesday</name> 
    </artist> 
</artists> 

следующий вывод:

<artist id="1"> 
    <name>John Sunday</name> 
</artist> 
<artist id="2"> 
    <name>John Monday</name> 
</artist> 
<artist id="3"> 
    <name>John Tuesday</name> 
</artist> 

Для справки: https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/translate
и в качестве дальнейшего объяснения: для синтаксиса translate(string, toReplace, replacement)<xsl:value-of select="translate('BCD','BCD','123')"/> в сопоставлении с шаблоном id присваивает в качестве значения перевод BCD в 123, as th e первый параметр - string - не текущее значение id, а строка BCD.

+0

Спасибо так много @matthias_h! Первое решение сработало. –

3

Или просто:

<xsl:template match="artist"> 
    <artist id="{translate(id,'BCD','123')}"> 
     <xsl:copy-of select="name"/> 
    </artist> 
</xsl:template>