2013-11-27 19 views
5

xml wejściowe isanalizowania elementów XML wewnątrz CDATA Korzystanie XSLT i drukowanie HTML

<getArtifactContentResponse> 
<return> 
<![CDATA[ 
<metadata> 
<overview>  
<name>scannapp</name> 
<developerId>developer702</developerId> 
<stateId>2</stateId> 
<serverURL>abc.com</serverURL> 
<id>cspapp1103</id> 
<description>scann doc</description> 
<hostingTypeId>1</hostingTypeId>  
</overview> 
</metadata> 
    ]]> 
    </return> 
</getArtifactContentResponse> 

Poniżej znajduje się arkusz stylów którego rozwinęły. Jestem w stanie pobrać kod XML wewnątrz Cdata, ale nie mogę pobrać wartości elementów.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" > 
<xsl:output method="html" encoding="utf-8" omit-xml-declaration="no" indent="no"/> 
    <xsl:template match="/"> 
     <html> 
     <body> 
      <h1>Company Details</h1> 
      <table border="1"> 
       <tr> 
        <th>name</th> 
        <th>developerId</th> 
        <th>Id</th> 
       </tr>table 

       <xsl:variable name ="data" select="//getArtifactContentResponse/return/node()" /> 
        <tr> 
        <td> 
         <xsl:value-of select="$data/metadata/overview/name" disable-output-escaping="yes"/> 


        </td> 
        <td> 
         <xsl:value-of select="$data/metadata/overview/developerId" /> 
        </td> 
        <td> 
         <xsl:value-of select="$data/metadata/overview/Id" /> 
        </td> 
        </tr> 

      </table> 

     </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

Wyjście przyjście jako

<html><body><h1>Company Details</h1><table border="1"><tr><th>name</th><th>developerId</th><th>serverURL</th></tr>table 


        <tr><td></td><td></td><td></td></tr></table></body></html> 

oczekiwany wynik

<html><body><h1>Company Details</h1><table border="1"><tr><th>name</th><th>developerId</th><th>serverURL</th></tr>table 


        <tr><td>scannapp</td><td>developer702</td><td>cspapp1103</td></tr></table></body></html> 

chcę wziąć nazwę wartości, developerId, ID i drukować do formatu HTML. Jak to zrobić Pomóż mi. Używanie XSLT w wersji 1.0.

+2

Z którego procesora XSLT 1.0 korzystasz? Potrzebujesz funkcji rozszerzenia, która może parsować ciąg znaków z XML do węzłów. –

+0

@MartinHonnen Jaką funkcję masz na myśli? –

+0

@ user3016153, w zależności od procesora XSLT istnieją istniejące rozwiązania lub jest łatwe do wdrożenia, na przykład z 'XslCompiledTransform' firmy Microsoft można użyć funkcji rozszerzenia lub obiektu, który używa" XPathDocument "do parsowania XML. Dzięki MSXML firmy Microsoft możesz użyć funkcji rozszerzenia zaimplementowanej w JScript, która po prostu musi utworzyć np. 'function parseXml (string) {var doc = new ActiveXObject ('Msxml2.DOMDocument.3.0'); doc.loadXML (ciąg); return doc; } '. –

Odpowiedz

1

AFAIK, nie można przetworzyć pliku CDATA jako XML.

Użycie funkcji rozszerzenia do przeanalizowania sekcji jako tekstu byłoby miłe, ale niezbyt konieczne. Oto przykład, który wyodrębnia trzy elementy, które chcesz:

... 
<xsl:variable name ="cdata" select="/getArtifactContentResponse/return" /> 

<name> 
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;name&gt;'), '&lt;/name&gt;')"/> 
</name> 

<developerId> 
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;developerId&gt;'), '&lt;/developerId&gt;')"/> 
</developerId> 

<id> 
    <xsl:value-of select="substring-before(substring-after($cdata, '&lt;id&gt;'), '&lt;/id&gt;')"/> 
</id> 
... 
+0

Kod działa poprawnie. Otrzymuję oczekiwany wynik. Wielkie dzięki. Czy jest jakiś alternatywny sposób, ponieważ nie chcę używać funkcji podłańcuchów. – user3042857

+0

Uważam, że funkcja substring zapewnia najkrótszą ścieżkę do oczekiwanego wyniku. Dlaczego nie chcesz go użyć? –