2013-07-07 7 views
0

я следующий XML (упрощенный)вывода XML в HTML с использованием XSL

<?xml version="1.0" encoding="UTF-8"?> 
<REPOSITORY> 
<VIEW UPDATED_BY="SADMIN"> 
    <VIEW_LOCALE UPDATED_BY="SADMIN"> </VIEW_LOCALE> 
    <VIEW_WEB_TEMPLATE UPDATED_BY="SADMIN" COMMENTS="TEST COMMENT"> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="SADMIN"></VIEW_WEB_TEMPLATE_ITEM> 
     </VIEW_WEB_TEMPLATE> 
    </VIEW> 
<VIEW UPDATED_BY="USER"> 
    <VIEW_LOCALE UPDATED_BY="USER"> </VIEW_LOCALE> 
    <VIEW_WEB_TEMPLATE UPDATED_BY="USER"> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER"></VIEW_WEB_TEMPLATE_ITEM> 
     <VIEW_WEB_TEMPLATE_ITEM UPDATED_BY="USER2"></VIEW_WEB_TEMPLATE_ITEM> 
     </VIEW_WEB_TEMPLATE> 
    </VIEW> 
</REPOSITORY> 

мне нужно пройти этот XML и напечатать вывод в HTML-таблицы. Ниже XSL я придумал

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:template match ="/" > 
<html><head></head> 
<body> 
    <xsl:apply-templates /> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="/" > 
<xsl:for-each select="REPOSITORY/VIEW"> 
<table> 
    <tr> 
    <td>Updated By</td> 
    <td><xsl:value-of select="@UPDATED_BY" /></td> 
    </tr> 
</table> 
<xsl:if test="./VIEW_WEB_TEMPLATE"> 
    <table> 
     <tr><td>Updated By</td><td>Comments</td></tr> 
     <xsl:for-each select="*[name()='VIEW_WEB_TEMPLATE']"> 
     <tr> 
      <td><xsl:value-of select="@UPDATED_BY" /></td> 
      <td><xsl:value-of select="@COMMENTS" /></td> 
     </tr> 
     </xsl:for-each> <!-- end of view_web_template -->  
    </table> 
    <xsl:if test="./VIEW_WEB_TEMPLATE_ITEM"> 
     <table> 
     <tr><td>Updated by</td></tr> 
      <xsl:for-each select="./VIEW_WEB_TEMPLATE_ITEM"> 
       <tr> 
        <td><xsl:value-of select="@UPDATED_BY" /></td> 
       </tr> 
      </xsl:for-each> <!-- end of web_template_item --> 
     </table> 
    </xsl:if> 
</xsl:if> 
</xsl:for-each> <!-- end of view --> 
</xsl:template> 
</xsl:stylesheet> 

Я знаю, что это может быть не лучший способ сделать это, но я не в состоянии получить узловые данные о VIEW_WEB_TEMPLATE_ITEM в таблице. Условие if не работает.

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

Таким образом, мой XPATH должен быть , если ранее обработанный узел имеет дочерний элемент, затем выберите его, но я недостаточно разбираюсь в XSLT, чтобы иметь возможность сделать это. Любые указатели ??

ответ

0

XSLT не заботится (или отслеживает), какие узлы были обработаны. Совершенно верно несколько раз выбирать и обрабатывать одни и те же узлы.

Проблема в этом случае является одним из контекстов. Первый и второй операторы xsl:if имеют один и тот же контекст XSLT, а именно элемент VIEW. Но для соответствия элементу VIEW_WEB_TEMPLATE_ITEM контекст должен быть элементом VIEW_WEB_TEMPLATE. С чисто технической точки зрения все, что вам нужно сделать, это написать <xsl:if select="VIEW_WEB_TEMPLATE/VIEW_WEB_TEMPLATE_ITEM">, и условие будет истинным.

Это, в вашем конкретном случае, я думаю, вы захотите переместить второе условие внутри <xsl:for-each>. Тогда он будет в правильном контексте, так как <xsl:for-each> обрабатывает элементы VIEW_WEB_TEMPLATE.

+0

Спасибо, что сработало отлично. Я не мог использовать его внутри для каждого, поскольку он должен быть независимой таблицей. Поэтому я изменил предложение if и select. – Neel

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