2013-05-15 8 views
4

Я не могу понять, как получить доступ ко всем атрибутам в теге из XML-документа.Получить все значения атрибутов из XML с помощью XSLT

Допустим, у меня есть следующий XML:

<names> 
    <name firstname="Rocky" lastname="Balboa" divider=", "/> 
    <name firstname="Ivan" lastname="Drago" divider=", "/> 
</names> 

Я хочу следующий вывод: Rocky Balboa, Ivan Drago,

То, что я в настоящее время является:

<xsl:for-each select="names/name"> 
    <xsl:value-of select="@firstname"/> 
    <xsl:value-of select="@lastname"/> 
    <xsl:value-of select="@divider"/> 
</xsl:for-each> 

Что мне интересно если это возможно сделать только в одном значении - вместо того, чтобы делать три из них. Поэтому, чтобы уточнить, я хочу иметь возможность выводить все атрибуты в теге с одним единственным значением-select. Это возможно?

Спасибо.

+0

Вы можете использовать XPath @ *, чтобы получить все атрибуты, например:
user1188611

+0

please рассмотрим возможность использования. Из-за странных причин форматирование не работает на моем конце. – user1188611

+0

Хорошо, я думаю, вы могли бы это сделать. Но я хочу выяснить, как/если это возможно сделать так, как у меня есть, но с одним значением выбора. –

ответ

-1

Вы можете использовать XPath @ *, чтобы получить все атрибуты, например .:

<xsl:template match="/*"> 
    <xsl:for-each select="@*"> 
     <xsl:value-of select="concat(name(), ': ', ., ' ')"/> 
    </xsl:for-each> 
</xsl:template> 

Это позволит вам использовать только одно значение из-выбрать, чтобы получить вывод, который вы хотите. Он учитывает все атрибуты.

Это должен быть достаточный намек на то, чтобы вы могли выяснить вещи. Дайте мне знать, если у вас есть другие вопросы.

+0

не так много общего с запросом. Вы генерируете нечто вроде «firstname: Ivan lastname: ...» (если есть). Но просят: «Рокки Бальбоа, Иван Драго,' –

3

Потому что я не уверен, что использование xsl:value-of является трудным требованием, возможно, что-то вроде следующего может быть тем, за что вы блокируете.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="name" mode ="print" > 
     <xsl:value-of select="@firstname"/> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="@lastname"/> 
     <xsl:value-of select="@divider"/> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="names/name" mode="print"/> 
    </xsl:template> 

</xsl:stylesheet> 

Вы можете использовать <xsl:apply-templates select="names/name" mode="print"/> в любом положении вы рассмотрели об использовании повышенно-в в одной строке для всех атрибутов.
выше шаблон будет генерировать следующий вывод:

Rocky Balboa, Ivan Drago, 

Обновление выходного сигнала клеть без использования имен атрибутов:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="name" mode ="print" > 
     <xsl:for-each select="@*" > 
      <xsl:if test="not(position() = last() or position() = 1)"> 
       <xsl:text> </xsl:text> 
      </xsl:if> 
      <xsl:value-of select="."/> 

     </xsl:for-each> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="names/name" mode="print"/> 
    </xsl:template> 

</xsl:stylesheet> 
0

Если вы можете использовать XSLT 2.0, вы можете сделать что-то вроде этого:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="text()"/> 

    <xsl:template match="*[@*]"> 
     <xsl:value-of select="@*[not(name()='divider')]" separator=" "/> 
     <xsl:value-of select="@divider"/>   
     <xsl:apply-templates/> 
    </xsl:template> 

</xsl:stylesheet> 

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

<xsl:value-of select="(@firstname,@lastname)" separator=" "/> 

или сделать xsl:apply-templates с xsl:sort сортировать атрибуты по name() (или любой другой). Дайте мне знать, если вы хотите пример.

+0

Я, должно быть, неправильно объяснил. Мне интересно, можно ли распечатать все атрибуты, но не называть имена атрибутов. Что-то вроде value-of select «*» или вдоль этих строк. –

+0

@ ErikÅstrand - Вот что '' does, за исключением того, что он игнорирует атрибут 'divider'. Вы также можете сделать '', но вам не гарантировано, что 'divider' будет последним выходом. –

0

следующие работы в XSLT 2.0:

<xsl:for-each select="names/name"> 
    <xsl:value-of select="@firstname, @lastname, @divider"/> 
</xsl:for-each> 

и 3.0 вы можете сделать:

<xsl:value-of select="names/name!(@firstname, @lastname, @divider)"/> 

хотя вам, возможно, потребуется внести коррективы, чтобы получить пробелы так, как вы этого хотите.

+0

Эй. Спасибо за ответ. Мне не интересно задавать, как распечатывать все атрибуты в одной строке, вызывая имена атрибутов. Я ищу способ просто вызвать все атрибуты, независимо от имен. Что-то в этих строках: value-of select = "*". Что-то, что может печатать все атрибуты, но не путем их вызова по отдельности. –

+0

Ну, это просто '@ *'. –

1

попробуйте следующее:

<xsl:template match="/"> 
<xsl:for-each select="names/name/@*"> 
     <xsl:value-of select="concat(., ' ')"/> 
    </xsl:for-each> 
</xsl:template>  
Смежные вопросы