Форматирование документа XSLT для отображения нескольких псевдонимов в одной строке - PullRequest
3 голосов
/ 25 октября 2011

Мои XML-документы содержат список людей, и у этих людей может быть 0 или более псевдонимов. У меня возникают проблемы при попытке правильно отобразить все псевдонимы в моем документе xslt.

Я могу получить список всех псевдонимов, используя:

<xsl:for-each select="name/nickname">

    Nickname: <xsl:value-of select="." />

</xsl:for-each>

Вывод это что-то вроде:

Nickname: nickname1
Nickname: nickname2

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

Nickname: nickname1, nickname2.

Что у меня сейчас есть:

<p>
    Nickname: 

    <xsl:for-each select="name/nickname">

        <xsl:value-of select="." />, 

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

Проблемы с этим:

  1. Ник всегда будет напечатан хотя бы один раз, даже если псевдоним не существует.
  2. Всегда будет запятая (,).

Я надеюсь, что есть предложения обойти эти две проблемы, я пытался использовать! = "", Но я не уверен, разрешено ли это, если у человека нет псевдонима.

Спасибо:)

Ответы [ 5 ]

1 голос
/ 25 октября 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="name[nickname]">
     <xsl:text>&#xA;Nicknames: </xsl:text>
       <xsl:apply-templates select="nickname"/>
 </xsl:template>

 <xsl:template match="nickname">
  <xsl:if test="not(position() = 1)">
    <xsl:text>, </xsl:text>
  </xsl:if>
  <xsl:apply-templates/>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML :

<t>
 <person>
  <name trueName="John">
    <nickname>X1</nickname>
    <nickname>X2</nickname>
    <nickname>X3</nickname>
  </name>
 </person>
 <person>
  <name trueName="Peter">
    <nickname>Y1</nickname>
    <nickname>Y2</nickname>
    <nickname>Y3</nickname>
  </name>
 </person>
 </t>

создает искомое значение,правильный результат :

Nicknames: X1, X2, X3
Nicknames: Y1, Y2, Y3
0 голосов
/ 25 октября 2011

Или в XSLT 2.0:

Ввод:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <nickname>1</nickname>
  <nickname>2</nickname>
  <nickname>3</nickname>
</test> 

Преобразование:

<xsl:template match='/'>
Nickname: <xsl:value-of select="/test/nickname" separator=", "/>
</xsl:template>
0 голосов
/ 25 октября 2011

Или,

<xsl:for-each select="name/nickname">
    <xsl:if test="position() = 1">Nickname: </xsl:if>
    <xsl:value-of select="." />
    <xsl:if test="not(position()=last())">, </xsl:if>
</xsl:for-each>
0 голосов
/ 25 октября 2011

Вход:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <nickname>1</nickname>
  <nickname>2</nickname>
  <nickname>3</nickname>
</test> 

Преобразование:

<xsl:template match='/'>
    <xsl:if test='count(//nickname) > 0'>
      <result>
      <xsl:for-each select='//nickname'>
        <xsl:choose>
          <xsl:when test='position() = 1'>
            Nickname : <xsl:value-of select="."/><xsl:if test="not(position() = last())">,</xsl:if>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="."/>
            <xsl:if test="not(position() = last())">,</xsl:if>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
      </result>
    </xsl:if>
  </xsl:template>

Выход:

<?xml version="1.0" encoding="UTF-8"?>
<result>Nickname : 1,2,3</result>
0 голосов
/ 25 октября 2011

Нечто подобное (не проверено):

<xsl:when test="name/nickname">
 Nickname:
 <xsl:for-each select="name/nickname">
   <xsl:value-of select="." />
   <xsl:if test="count(following-sibling::nickname)">,</xsl:if> 
  </xsl:for-each>
</xsl:when>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...