2017-08-17 67 views
0

我有文件XML爲什麼不工作(與XML,XSLT)

<?xml version="1.0" encoding="utf-8"?> 
<library xmlns="http://example.net/library/1.0"> 
    <books> 
     <book id="b1"> 
      <author id="a1"> 
       <name>Henryk</name> 
       <surname>Kowalski</surname> 
       <born>1991-01-23</born> 
      </author> 
      <title>"Do okoła Ziemi"</title> 
      <published>1993</published> 
      <isbn>985-12-23-15489-23</isbn> 
     </book> 
     <book id="b2"> 
      <author id="a2"> 
       <name>Franek</name> 
       <surname>Brzeczyszczykiewicz</surname> 
       <born>1975-09-05</born> 
       <died>1999-12-30</died> 
      </author> 
      <title>Jak rozpetałem II wojnę światową</title> 
      <published>1968</published> 
     </book> 
    </books> 
</library> 

和文件XSL

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns1="http://void.net/library/1.0"> 
    <xsl:output method="text" indent="no" /> 
    <xsl:template match="/books"> 
     <xsl:text>author,title,published 
     </xsl:text> 
     <xsl:for-each select="book"> 
      <xsl:value-of select="concat(author/name, ', ', author/surname, ', ', title, ', ', published, ' ')" /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我找不到錯誤。因此,它會獲取XML文件的內容,即未定義的字段。有人能告訴我錯誤在哪裏?

+0

爲什麼你需要這個:'xmlns:ns1 =「http://void.net/library/1.0」'? –

+0

我在另一個例子的基礎上做了。只有XSL語言學習。 – Anzor

+0

不要做巫術編程。 –

回答

0

您在樣式表中缺少命名空間。
XML文件中的所有元素都位於命名空間xmlns="http://example.net/library/1.0"中。所以你必須將它包含在XSL文件中的所有XPath表達式中。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ns1="http://void.net/library/1.0" 
    xmlns:ns2="http://example.net/library/1.0"> <!-- namespace from XML file --> 
    <xsl:output method="text" indent="no" /> 
    <xsl:template match="ns2:books">    <!-- removed root '/', because ns2:books is not root --> 
     <xsl:text>author,title,published 
     </xsl:text> 
     <xsl:for-each select="ns2:book"> 
      <xsl:value-of select="concat(ns2:author/ns2:name, ', ', ns2:author/ns2:surname, ', ', ns2:title, ', ', ns2:published, '&#xa;')" /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

我還在行尾添加了換行符而不是空格。

+0

它的工作原理!我還有一個問題。如何在名稱前插入換行符? – Anzor

+0

@Anzor:只要在它前面放一個' ';-) – zx485

+0

它適合我。非常感謝你 :) – Anzor