2014-01-20 2 views
2

Я относительно новым для XSLT Мне нужно, чтобы выбрать комментарии элементы из в соответствии с которым после использования PID текущего постаXSLT вложенными выбирает

Часть XSLT У меня возникли проблемы с

<xsl:for-each select="posts/post"> 
    <div class="post"> 
     <h3><xsl:value-of select="ptitle"/></h3> 
     <span><xsl:value-of select="ptext"/></span> 
     <xsl:variable name="pid" select="@pid" /> 
     <!-- Here i need to select the comment according to the pid --> 
    </div> 
    <br /> 
</xsl:for-each> 

The код XML

<posts> 
     <post pid="p2"> 
      <ptitle>APPLICATIONS OF THE FUTURE</ptitle> 
      <pfeatureimage>aig.jpg</pfeatureimage> 
      <ptext xml:lang="en">just text </ptext> 
      <pdate>25062013</pdate> 
      <pimg>future.jpg</pimg> 
      <pimg>future.jpg</pimg> 
      <pimg>future.jpg</pimg> 
      <pauthorid>a3</pauthorid> 
     </post> 
    </posts> 

    <comments> 
     <comment cid="c1"> 
      <pid>p2</pid> 
      <uid>u2</uid> 
      <ctext>other t</ctext> 
      <likes>5</likes> 
      <dislikes>1</dislikes> 
     </comment> 
       <comment cid="c2"> 
      <pid>p3</pid> 
      <uid>u2</uid> 
      <ctext>bogsg</ctext> 
      <likes>5</likes> 
      <dislikes>1</dislikes> 
     </comment> 
    </comments> 
+0

Выражения XPath вам нужно это: '// комментарии/комментарий [PID = ток()/@ PID] '. –

ответ

3

Путь к подойти к любой кросс-ссылки на проблему, как это в XSLT является использование key. Ставит определение ключа в верхнем уровне таблицы стилей (вне каких-либо шаблонов):

<xsl:key name="commentsByPid" match="comment" use="pid" /> 

Выражения match определяет, какие узлы смотреть, и use путь, который оценивается по отношению к каждому согласованному узлу для определения значения ключа (так что в этом случае оно будет принимать строковое значение элемента pid внутри каждого сопоставленного comment).

С помощью этого ключа определения вы можете эффективно искать все комментарии, которые соответствуют атрибутам текущей записи в pid с помощью key функции:

<xsl:for-each select="posts/post"> 
    <div class="post"> 
     <h3><xsl:value-of select="ptitle"/></h3> 
     <span><xsl:value-of select="ptext"/></span> 
     <xsl:for-each select="key('commentsByPid', @pid)"> 
      <!-- do whatever you need with the <comment> here --> 
     </xsl:for-each> 
    </div> 
    <br /> 
</xsl:for-each> 
+0

* «Способ подходить к любой проблеме перекрестных ссылок, подобной этой в XSLT, - это использовать ключ» * Вот что я тоже думаю (+1), но, видимо, не все согласны: http://stackoverflow.com/a/ 21230772/3016153 –

+0

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

+0

@MichaelKay Для меня оптимизированная производительность - это бонус; Я нахожу ключи более читабельными и поддерживаемыми. Но тогда я мог бы пристраститься к работе с реляционными базами данных. –

0

Для одного комментария, заменить ваше определение переменной

<xsl:variable name="pid" select="@pid" /> 

по

<xsl:value-of select="//comments/comment[pid=current()/@pid]/ctext" /> 

Если у вас есть несколько комментариев, вы можете попробовать

<xsl:variable name="pid" select="@pid" /> 
<xsl:for-each select="//comments/comment[pid=$pid]"> 
    <xsl:value-of select="ctext" /> 
</xsl:for-each> 
+0

Спасибо за помощь – user3216544

+0

Ответ от Яна намного лучше. Раньше этого не знал. –

Смежные вопросы