Avatar billede nielsen2002 Nybegynder
05. juni 2009 - 10:05 Der er 4 kommentarer og
1 løsning

Find værdier i Escaped XML

Hej Experter,

Jeg er ved at kigge på hvordan jeg kan trække værdier ud af dette XML via XSLT.

Min XML kommer fra et eksternt system, så jeg kan ikke ændre i det.
XML'en ser således ud:

<?xml version="1.0" encoding="UTF-8"?>
<OrderLineFieldValues>&lt;OrderLineFieldValueCollection&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwProductMeasurements&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;1500mm x 200mm&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwVareKategori&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;x-2005&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;/OrderLineFieldValueCollection&gt;</OrderLineFieldValues>

Så værdierne i <OrderLineFieldValues> noden er escaped når jeg modtager det, så jeg kan ikke umiddelbart lave Xpath på det.

Hvis jeg unescaper det ser det således ud.

<OrderLineFieldValues>
<OrderLineFieldValueCollection>
  <OrderLineFieldValue>
  <OrderLineFieldSystemName>DwProductMeasurements</OrderLineFieldSystemName>
  <Value>1500mm x 200mm</Value>
  </OrderLineFieldValue>
  <OrderLineFieldValue>
  <OrderLineFieldSystemName>DwVareKategori</OrderLineFieldSystemName>
  <Value>x-2005</Value>
  </OrderLineFieldValue>
</OrderLineFieldValueCollection>
</OrderLineFieldValues>

Jeg har f.eks. behov for at få fat i <Value> feltet som hører til DwProductMeasurements.

Men jeg kan ikke lige gennemskue hvordan jeg kommer i gang med at læse den escapede XML.

Det skal helst laves i ren XSLT 1.0 hvis muligt.

Er der noget der har lavet noget lignende?

Mvh
Martin
Avatar billede arne_v Ekspert
07. juni 2009 - 01:03 #1
Har du mulighed for at lave en dobbelt transformering ?

Først:

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

  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="text()">
    <xsl:value-of disable-output-escaping="yes" select="."/>
  </xsl:template>

  <xsl:template priority="-1" match="@* | * | text() | processing-instruction() | comment()">
    <xsl:copy>
      <xsl:apply-templates select="@* | * | text() | processing-instruction() | comment()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

og så:

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

  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates select="/OrderLineFieldValues/OrderLineFieldValueCollection/OrderLineFieldValue[OrderLineFieldSystemName='DwProductMeasurements']/Value"/>
  </xsl:template>

  <xsl:template match="Value">
    <svar><xsl:value-of select="text()"/></svar>
  </xsl:template>

</xsl:stylesheet>

?
Avatar billede nielsen2002 Nybegynder
08. juni 2009 - 16:34 #2
Hej Arne,

Ja det ser ud til at fungere hvis mit XML var så simpelt som jeg har lagt op til i mit spørgsmål.

I mit forsøg på at forsimple min problemstilling, har jeg kun vist et udsnit af min komplette XML.

Jeg har f.eks. også en node med en encoded url som ikke må blive påvirket at decodingen.

Sådan her ser mit den komplette opbygning af min XML ud:
<Order>
    <OrderID>Order1</OrderID>
    <OrderLine>   
        <OrderLineID>1</OrderLineID>
        <OrderLineReference>http://compotech.net.dynamicweb.dk/Produkt-8.aspx?ProductID=PROD13&amp;GroupID=GROUP1&amp;VariantID=VO2</OrderLineReference>
        <OrderLineFieldValues>&lt;OrderLineFieldValueCollection&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwProductMeasurements&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;700mm x 396mm&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwVareKategori&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;x-2001&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;/OrderLineFieldValueCollection&gt;</OrderLineFieldValues>
    </OrderLine>
    <OrderLine>   
        <OrderLineID>2</OrderLineID>
        <OrderLineReference>http://compotech.net.dynamicweb.dk/Produkt-8.aspx?ProductID=PROD13&amp;GroupID=GROUP1&amp;VariantID=VO2</OrderLineReference>
        <OrderLineFieldValues>&lt;OrderLineFieldValueCollection&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwProductMeasurements&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;700mm x 396mm&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;OrderLineFieldValue&gt;&lt;OrderLineFieldSystemName&gt;DwVareKategori&lt;/OrderLineFieldSystemName&gt;&lt;Value&gt;x-2001&lt;/Value&gt;&lt;/OrderLineFieldValue&gt;&lt;/OrderLineFieldValueCollection&gt;</OrderLineFieldValues>
    </OrderLine>
</Order>

Og det er så kun værdien i OrderLineFieldValues jeg ønsker unascaped.

Kan det lade sig gøre? jeg kan se din XML kalder sig selv.

Mvh
  Martin
Avatar billede arne_v Ekspert
09. juni 2009 - 04:30 #3
Prøv med:

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

  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="text()">
    <xsl:choose>
    <xsl:when test="local-name(parent::node())='OrderLineFieldValues'">
          <xsl:value-of disable-output-escaping="yes" select="."/>
    </xsl:when>
    <xsl:otherwise>
          <xsl:value-of disable-output-escaping="no" select="."/>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template priority="-1" match="@* | * | text() | processing-instruction() | comment()">
    <xsl:copy>
      <xsl:apply-templates select="@* | * | text() | processing-instruction() | comment()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
Avatar billede nielsen2002 Nybegynder
09. juni 2009 - 13:11 #4
Hej Arne.

Det fungerer bare perfekt!!

Tak for hjælpen,
Smid et svar så er der point :)
Avatar billede arne_v Ekspert
09. juni 2009 - 14:40 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester