2011-05-27 143 views
-1

所以,我有我的應用程序是這樣生成的XML文檔:如何用XSLT將特定類的未知XML元素格式化爲HTML?

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE AddressBook> 
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?> 
<AddressBook> 
<Item> 
    <UserGeneratedElementName1 class="info">Whatever blah blah</UserGeneratedElementName1> 
    <UserGeneratedElementName2 class="info">Whatever blah blah</UserGeneratedElementName2> 
</Item> 
<Item> 
    <UserGeneratedElementName3 class="info">Whatever blah blah</UserGeneratedElementName3> 
</Item> 
... 
... 
Other Items with user-generated elements with user-generated content... 
</AddressBook> 

而且我希望把它變成一個類似的HTML文檔:

<html> 
<head> 
<title>AddressBook</title> 
</head> 
<body> 
<div class="root"> 
    <div class="item"> 
    <b>UserGeneratedElementName1:</b> Whatever blah blah 
    <b>UserGeneratedElementName2:</b> Whatever blah blah 
    </div> 
    <div class="item"> 
    <b>UserGeneratedElementName3:</b> Whatever blah blah 
    </div> 
    ... 
    ... 
    Other transformed items... 
</div> 
</body> 
</html> 

我試圖讓一抓的XSLT語法,但是所有的指南要麼太模糊,不能幫助我解決這個問題,要麼太深入。另外XSLT語法看起來很混亂。 在此先感謝。

+0

「所有的指南都太模糊,無法幫助我解決這個問題或太深」你可能已經錯過了W3C或谷歌或搜索SO。 – 2011-05-27 19:27:37

回答

1

在這個問題看看這裏

Is there an XSLT name-of element?

您可以使用

<xsl:value-of select ="name(.)"/> 

<xsl:value-of select ="local-name()"/> 

得到一個節點的名稱,這取決於你想要包含完整的前綴名稱,或僅包含本地部分。

您應該可以將這些與xsl:for-each塊一起拼湊起來,以迭代項目的前三個級別並生成您正在尋找的HTML。

像這樣的東西可以適用於固定數量的水平。

<xsl:for-each select="*"> 
     <html> 
      <head> 
       <title><xsl:value-of select="local-name()" /></title> 
      </head> 
      <body> 
       <div class="root"> 
        <xsl:for-each select="*"> 
         <div> 
          <xsl:attribute name="class"> 
           <xsl:value-of select="local-name()" /> 
          </xsl:attribute> 
          <xsl:for-each select="*"> 
           <b><xsl:value-of select="local-name()" />:</b> <xsl:value-of select="." /> 
          </xsl:for-each> 
         </div> 
        </xsl:for-each> 
       </div> 
      </body> 
     </html> 
    </xsl:for-each> 

一個更通用的方法會看起來更象:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

<xsl:output method="html" indent="yes" version="4.0"/> 
<xsl:template match="/"> 
    <xsl:for-each select="*"> 
     <html> 
      <head> 
       <title><xsl:value-of select="local-name()" /></title> 
      </head> 
      <body> 
       <div class="root"> 
         <xsl:call-template name="recurseElement"> 
          <xsl:with-param name="element" select="." /> 
         </xsl:call-template> 
       </div> 
      </body> 
     </html> 
    </xsl:for-each> 
</xsl:template> 
<xsl:template name="recurseElement"> 
    <xsl:param name="element" /> 
    <xsl:for-each select="$element/*"> 
     <xsl:choose> 
       <xsl:when test="count(child::*)>0"> 
        <div> 
         <xsl:attribute name="class"> 
          <xsl:value-of select="local-name()" /> 
         </xsl:attribute> 
         <xsl:call-template name="recurseElement"> 
          <xsl:with-param name="element" select="." /> 
         </xsl:call-template> 
        </div> 
       </xsl:when> 
       <xsl:otherwise> 
        <b><xsl:value-of select="local-name()" />:</b> <xsl:value-of select="." /> 
       </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

請原諒我的無知,但是代碼不會創建多個HTML文檔,或者更確切地說,是不是它會在html文檔中創建多個html元素?當然,這會使其無效,因爲html文檔可能只有一個html元素。 – FNj 2011-05-27 20:05:36

+0

如果源XML文檔有多個根節點(這將是無效的XML),則底部的xslt只會生成多個HTML文檔。在這種情況下,第一個循環可能已被替換爲'xsl:for-each select =「/」',如果這樣做更有意義。我特意處理根目錄並將其包裝在HTML中的原因是因爲該示例顯示了用作HTML文檔的根元素的名稱,所以我試圖重現該原因。沒有更詳細的描述,這是我對預期產出的最好猜測。 – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/119123/">tschaible</a></span> <span>2011-05-27 22:13:48</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="4319274062" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">0<i class="fa fa-thumbs-up"></i></span> </div> <div class="post-offset"> <div class="answer fmt"> <p><strong>這個完整的XSLT轉換</strong>:</p> <pre><code class="prettyprint-override"><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="AddressBook"> <html> <head> <title>AddressBook</title> </head> <body> <div class="root"> <xsl:apply-templates/> </div> </body> </html> </xsl:template> <xsl:template match="Item"> <div class="item"><xsl:apply-templates/></div> </xsl:template> <xsl:template match="Item/*"> <b><xsl:value-of select="name()"/>:</b> <xsl:text/> <xsl:value-of select="concat(.,'&#xA; ')"/> </xsl:template> </xsl:stylesheet> </code></pre> <p><strong>時所提供的XML文檔</strong>應用:</p> <pre><code class="prettyprint-override"><AddressBook> <Item> <UserGeneratedElementName1 class="info">Whatever blah blah</UserGeneratedElementName1> <UserGeneratedElementName2 class="info">Whatever blah blah</UserGeneratedElementName2> </Item> <Item> <UserGeneratedElementName3 class="info">Whatever blah blah</UserGeneratedElementName3> </Item> ... ... Other Items with user-generated elements with user-generated content... </AddressBook> </code></pre> <p><strong>產生想要的,正確的結果</strong>:</p> <pre><code class="prettyprint-override"><html> <head> <title>AddressBook</title> </head> <body> <div class="root"> <div class="item"> <b>UserGeneratedElementName1:</b>Whatever blah blah <b>UserGeneratedElementName2:</b>Whatever blah blah </div> <div class="item"> <b>UserGeneratedElementName3:</b>Whatever blah blah </div> ... ... Other Items with user-generated elements with user-generated content... </div> </body> </html> </code></pre> <p><strong>說明</strong>:</p> <ol> <li><p><a href="http://www.w3.org/TR/1999/REC-xslt-19991116#rules" rel="nofollow"><strong>Templates matching</strong></a>任何<code class="prettyprint-override">Item</code>元素和<code class="prettyprint-override">Item</code>元素的任何元素的孩子。</p></li> <li><p><strong>使用標準XPath <a href="http://www.w3.org/TR/xpath/#function-name" rel="nofollow"><code class="prettyprint-override">name()</code></a>函數</strong>。</p></li> </ol> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/6159365">來源</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2011-05-28 02:48:00</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> <!-- comments --> <div class="comments"> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">這條線究竟做了什麼? '<xsl:value-of select =「concat(。,' ')」/>' – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/771508/">FNj</a></span> <span>2011-05-28 08:01:21</span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">@FNj:xsl:select-value-'concat(。,' ')「/>輸出串聯的使用新行字符(它具有10或十六進制A的代碼)將當前節點(即與模板匹配)的steing值。可以使用*字符引用*通過其代碼輸出任何字符 - 在形成'&#xxxx;'(這是十進制)或'&#xabcd;'(這是十六進制)。 – <span class="text-secondary"> <small> <span>2011-05-28 13:59:19</span> </small> </span> </p> </div> </div> </div> </div> </div> </article> </div> <div class="clearfix"> </div> <div> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3534119089"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img2.voidcc.com/voidso/script/side.js?t=1652515421930"></script> <script type="text/javascript" src="http://img2.voidcc.com/voidso/plugin/highlight/highlight.pack.js"></script> <link href="http://img2.voidcc.com/voidso/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- VOIDCC问答侧边栏广告 --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="3862022848" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> 最新問題 </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://hk.voidcc.com/question/p-kutgwkrj-bdt.html" target="_blank" title="組成由表演作品的班級未導入的部分的好方法是什麼?"> 組成由表演作品的班級未導入的部分的好方法是什麼? </a> </li> <li class="side_article_list_item"> 2. <a href="http://hk.voidcc.com/question/p-hqujrngi-bkr.html" target="_blank" title="如何在.NET Core中獲取defaultNamingContext?"> 如何在.NET Core中獲取defaultNamingContext? </a> </li> <li class="side_article_list_item"> 3. <a href="http://hk.voidcc.com/question/p-gvkppzqr-cc.html" target="_blank" title="如何使用gdb在特定的正在運行的應用程序的文件中調試函數?"> 如何使用gdb在特定的正在運行的應用程序的文件中調試函數? </a> </li> <li class="side_article_list_item"> 4. <a href="http://hk.voidcc.com/question/p-bldgiatc-d.html" target="_blank" title="在WPF中展開和摺疊"> 在WPF中展開和摺疊 </a> </li> <li class="side_article_list_item"> 5. <a href="http://hk.voidcc.com/question/p-rdwibwwr-td.html" target="_blank" title="標籤變量循環"> 標籤變量循環 </a> </li> <li class="side_article_list_item"> 6. <a href="http://hk.voidcc.com/question/p-hldknlqz-tg.html" target="_blank" title="是不是將屬性設置爲等於有效的HTML值?"> 是不是將屬性設置爲等於有效的HTML值? </a> </li> <li class="side_article_list_item"> 7. <a href="http://hk.voidcc.com/question/p-ffbcpylg-ve.html" target="_blank" title="如何實現全局密鑰監聽器?"> 如何實現全局密鑰監聽器? </a> </li> <li class="side_article_list_item"> 8. <a href="http://hk.voidcc.com/question/p-rcpovuwr-vd.html" target="_blank" title="Laravel 5廣播事件到通配符通道使用節點和Laravel ECHO-服務器"> Laravel 5廣播事件到通配符通道使用節點和Laravel ECHO-服務器 </a> </li> <li class="side_article_list_item"> 9. <a href="http://hk.voidcc.com/question/p-oxcpefrk-uw.html" target="_blank" title="選擇默認類型要下載"> 選擇默認類型要下載 </a> </li> <li class="side_article_list_item"> 10. <a href="http://hk.voidcc.com/question/p-wsgvjows-bmd.html" target="_blank" title="列表分支按創建日期排序"> 列表分支按創建日期排序 </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> 相關問題</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">暫無相關問題^_^</li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://hk.voidcc.com/contact">聯系我們</a></li> <li>© 2020 HK.VOIDCC.COM</li> <li><a rel="nofollow" href="https://beian.miit.gov.cn/" target="_blank">沪ICP备13005482号-13</a></li> <li><script type="text/javascript" src="https://s9.cnzz.com/z_stat.php?id=1280098168&web_id=1280098168"></script></li> <li><a href="http://cn.voidcc.com/" target="_blank" title="程序问答园区">简体中文</a></li> <li><a href="http://hk.voidcc.com/" target="_blank" title="程序問答園區">繁體中文</a></li> <li><a href="http://ru.voidcc.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.voidcc.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.voidcc.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.voidcc.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.voidcc.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.voidcc.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.voidcc.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.voidcc.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.voidcc.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.voidcc.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.voidcc.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-77509369-5"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'UA-77509369-5'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?67d4731349f0b00136755b80364ce381"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>