2017-03-23 2 views
0

Ich versuche, untergeordnete Knoten in einem XML-Dokument zu durchlaufen, aber ich kann nicht die korrekte Syntax erhalten. Die XML-Dateien werden mit einem Namespace geliefert, so dass ich in meinem XSL-Dokument diesen Namespace mit einem Alias ​​versehen habe. Eine einfache Version meiner XML-Dokument sieht wie folgt aus:Looping durch untergeordnete Knoten im XML-Dokument mithilfe von XSL

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="my.xsl"?> 
<game id="4496878f-921c-41ab-9fcd-54906a9ed89c" status="closed"> 
    <summary> 
    <quarter id="1" points="10"/> 
    <quarter id="2" points="3"/> 
    <quarter id="3" points="0"/> 
    <quarter id="4" points="6"/> 
    </summary> 
</game> 

Meine XSL-Dokument wie folgt aussieht:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:f="my.xsl"> 
<xsl:output method="text" indent="no" /> 

<xsl:template match="/"> 
     <xsl:text>QUARTER,POINTS</xsl:text> 
     <xsl:apply-templates select="/f:game/f:summary" /> 
</xsl:template> 

<xsl:template match="f:summary"> 
     <xsl:text>&#13;</xsl:text> 
     <xsl:for-each select"/f:quarter"> 
       <xsl:text>"</xsl:text><xsl:value-of select="@id"/><xsl:text>"</xsl:text> 
       <xsl:text>,"</xsl:text><xsl:value-of select="@points"/><xsl:text>"</xsl:text> 
     </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

Pflegen Sie die gleichen Namensräume sowohl in XML als auch in XSLT, ansonsten unterscheiden sich Elemente wie 'f: summary' von' summary'. –

Antwort

1
Xml add Namespace 

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="Untitled4.xsl"?> 
<game id="4496878f-921c-41ab-9fcd-54906a9ed89c" status="closed" xmlns="http://www.test.com/"> 
<summary> 
<quarter id="1" points="10"/> 
<quarter id="2" points="3"/> 
<quarter id="3" points="0"/> 
<quarter id="4" points="6"/> 
</summary> 
</game> 

und xsl-Datei namesapce

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.test.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslFormatting="urn:xslFormatting"> 
<xsl:output method="text" indent="no" /> 
<xsl:template match="/"> 
<xsl:text>QUARTER,POINTS</xsl:text> 
<xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="t:summary"> 
<xsl:text>&#13;</xsl:text> 
<xsl:for-each select="t:quarter"> 
<xsl:text>\"</xsl:text><xsl:value-of select="@id"/><xsl:text>\"</xsl:text> 
<xsl:text>,\"</xsl:text><xsl:value-of select="@points"/><xsl:text>\"</xsl:text> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
1

Die hinzufügen XML-Dateien haben einen Namensraum

Im angegebenen XML-Beispiel wird kein Namespace angezeigt. Wie andere festgestellt haben, müssen Sie, wenn Sie einen Namespace haben, das Präfix an denselben Namespace-URI binden, der in der Eingabe verwendet wird.

Zusätzlich <xsl:for-each select"/f:quarter"> versucht, ein Wurzelelement wählen namens quarter, die es nicht gibt. Ganz zu schweigen von der fehlenden =.

Sie bedeutete wahrscheinlich <xsl:for-each select=".//f:quarter">, aber Sie brauchen es nicht um die Kinder zu wählen (im Gegensatz zu Nachkommen gegen) des aktuellen Knotens - nur <xsl:for-each select="f:quarter"> tun.