xsl: for-each элементы, которые имеют атрибуты - PullRequest
0 голосов
/ 22 октября 2018

У меня есть этот xml

<Books>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Middlesex: A Novel</Title>
  <FBT>The Woman Warrior</FBT>
  <FBT>The House on Mango Street</FBT>
  <Isbn>0312427735</Isbn>
  <Author>
    <Name>
      <First>Jeffrey</First>
      <Last>Eugenides</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>110-222-3333</Phone>
    </Contact>
  </Author>
  <Publisher>Picador</Publisher>
  <Year Edition="1">2002</Year>
</Book>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Me Talk Pretty One Day</Title>
  <FBT>Dress Your Family in Corduroy and Denim</FBT>
  <FBT>Naked</FBT>
  <Isbn>9780316776967</Isbn>
  <Author>
    <Name>
      <First>David</First>
      <Last>Sedaris</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>119-222-3333</Phone>
    </Contact>
   </Author>
  <Publisher>Back Bay Books</Publisher>
  <Year Edition="2">2001</Year>
 </Book>
</Books>

. Основная проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь выполнить итерацию в своем коде xslt

<xsl:for-each select="Books/Book">

.книги, которые я упомянул.Я попытался выяснить, почему это может быть проблемой, не зная, что все же я удалил атрибуты из одного из экземпляров книги, и он, наконец, смог перейти к дочерним элементам, чтобы я мог поместить данные в таблицу.Мой первый вопрос: почему наличие атрибутов внутри элемента книги даже влияет на моего «для каждого»?

Во-вторых, есть ли способ обойти это?Я хотел бы сохранить атрибуты в книге.

РЕДАКТИРОВАТЬ: Вот часть, где я делаю цикл

 <xsl:for-each select="Books/Book">
          <tr style="font-size: 12pt; font-family: verdana">
            <td>

              <xsl:value-of select="Title"/>

            </td>
            <td>
              <xsl:value-of select="Isbn"/>
            </td>
            <td>
              <xsl:value-of select="Author"/>
            </td>
            <td>
              <xsl:value-of select="Publisher"/>
            </td>
            <td>
              <xsl:value-of select="Year"/>
            </td>
          </tr>
        </xsl:for-each>

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вам не хватает пространства имен в ваших элементах.
Поэтому определите пространство имен для вашего xsl:stylesheet элемента с помощью

xmlns:bk="http://tempuri.org/XMLSchema.xsd"

, которое установлено в качестве значения по умолчанию для вашего элемента Book, делая его

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bk="http://tempuri.org/XMLSchema.xsd">
...

И затем примените это изменение к своему шаблону, изменив его на

<xsl:template match="/">
  <xsl:for-each select="Books/bk:Book">
      <tr style="font-size: 12pt; font-family: verdana">
        <td>
          <xsl:value-of select="bk:Title"/>
        </td>
        <td>
          <xsl:value-of select="bk:Isbn"/>
        </td>
        <td>
          <xsl:value-of select="concat(bk:Author/bk:Name/bk:First,' ', bk:Author/bk:Name/bk:Last)"/>
        </td>
        <td>
          <xsl:value-of select="bk:Publisher"/>
        </td>
        <td>
          <xsl:value-of select="bk:Year"/>
        </td>
      </tr>
  </xsl:for-each>
</xsl:template>

Шаблон обертки можно удалить.
Результат желаемый.

0 голосов
/ 22 октября 2018

Похоже, вы используете правильный синтаксис

 <xsl:for-each select="Books/Book">
     <xsl:value-of select="Title" />
     <xsl:value-of select="FBT" /> 
 </xsl:for-each>

Если вы используете тот же способ, он должен работать, чтобы получить заголовок и FBT из вашего XML.Если возможно, попробуйте заполнить в таблице полный XML и проверить, где что-то пошло не так.С синтаксической точки зрения, это правильно в соответствии с W3School

Удивительно, но следующий XML работает нормально, может быть проблема с пространством имен (xmlns = "http://tempuri.org/XMLSchema.xsd"). Пожалуйста, проверьте один раз...

    <Books>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Middlesex: A Novel</Title>
  <FBT>The Woman Warrior</FBT>
  <FBT>The House on Mango Street</FBT>
  <Isbn>0312427735</Isbn>
  <Author>
    <Name>
      <First>Jeffrey</First>
      <Last>Eugenides</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>110-222-3333</Phone>
    </Contact>
  </Author>
  <Publisher>Picador</Publisher>
  <Year Edition="1">2002</Year>
</Book>
<Book Cover="Audiobook" xmlns="http://tempuri.org/XMLSchema.xsd">
  <Title>Me Talk Pretty One Day</Title>
  <FBT>Dress Your Family in Corduroy and Denim</FBT>
  <FBT>Naked</FBT>
  <Isbn>9780316776967</Isbn>
  <Author>
    <Name>
      <First>David</First>
      <Last>Sedaris</Last>
    </Name>
    <Contact Office="Office1">
      <Phone>119-222-3333</Phone>
    </Contact>
   </Author>
  <Publisher>Back Bay Books</Publisher>
  <Year Edition="2">2001</Year>
 </Book>
</Books>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...