XSLT получить пустое имя TAG - PullRequest
0 голосов
/ 16 марта 2019

Мне нужно выяснить профессию этих двух людей, где по желанию может появиться другая профессия.Поэтому я хотел бы узнать название всех пустых ярлыков, например:

<artists>
    <artist name="Ghiberti">
      <name>Lorenzo Ghiberti </name>
      <birth>1378</birth>
      <death>1455</death>
      <goldsmith /> <!-- This -->
      <sculptor /> <!-- This -->
    </artist>
    <artist name="Donatello">
      <name>Donato di Niccolò di Betto Bardi</name>
      <birth>1386</birth>
      <death>1466</death>
      <sculptor /> <!-- This -->
    </artist>
 </artists>

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

Miguel Ángel Buonarroti ( goldsmith, sculptor ) birth in 1475 and death in 1564
Giorgio Vasari (sculptor ) birth in 1511 and death in 1574

это мой фактический код:

<xsl:template match="artists">
    <h2> Artist florecian </h2>
    <xsl:for-each select="artist">
      <xsl:value-of select="name"/> (
    birth in <xsl:value-of select="birth"/> and death in <xsl:value-of select="death"/> <br/>
    </xsl:for-each>    
      </xsl:template>

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Ваша структура XML неверна. Попробуйте еще раз:

<artists>
    <artist name="Ghiberti">
      <name>Lorenzo Ghiberti </name>
      <birth>1378</birth>
      <death>1455</death>
      <profession>goldsmith</profession>
      <profession>sculptor</profession>
    </artist>
    <artist name="Donatello">
      <name>Donato di Niccolò di Betto Bardi</name>
      <birth>1386</birth>
      <death>1466</death>
      <profession>sculptor</profession>
    </artist>
 </artists>

Подумайте, почему вы выбрали <name>...</name>, а не <profession>...</profession>. С этим изменением ваш XSLT станет очень простым, я уверен, что вам не нужна помощь.

Конечно, вы можете получить имя узла с помощью name() функции XPath , но в этом случае это не правильное решение.

1 голос
/ 16 марта 2019

Попробуйте:

XSLT 2.0

<xsl:template match="artists">
    <h2> Artist florecian </h2>
        <xsl:for-each select="artist">
            <xsl:value-of select="name"/>
            <xsl:text> (</xsl:text>
            <xsl:value-of select="*[not(text())]/name()" separator=", "/>
            <xsl:text>) birth in </xsl:text>
            <xsl:value-of select="birth"/>
            <xsl:text> and death in </xsl:text>
            <xsl:value-of select="death"/> 
            <br/>
    </xsl:for-each>    
</xsl:template>

Демо: https://xsltfiddle.liberty -development.net / bFN1y98

...