2017-06-28 4 views
0

Ich habe eine eingehende XMl, wo ich Wert eines Attributs ersetzen möchte, wenn es einen bestimmten Wert hat. Das übergeordnete Element des Attributs "Algorithm" ist "Transform", die XML viele solcher Knoten in istErsetzen von Attributwert in XML

Incoming XML:

<ds:SignedInfo> 
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
     <ds:Reference URI="#pfx41d8ef22-e612-8c50-9960-1b16f15741b3"> 
     <ds:Transforms> 
      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
     </ds:Transforms> 
     <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <ds:DigestValue>yJN6cXUwQxTmMEsPesBP2NkqYFI=</ds:DigestValue> 
     </ds:Reference> 
    </ds:SignedInfo> 

XSL:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output omit-xml-declaration="yes" indent="yes"/> 
     <xsl:param name="pNewType" select="'myNewType'"/> 
     <xsl:template match="node()|@*"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()|@*"/> 
      </xsl:copy> 
     </xsl:template> 
     <xsl:template match="Transform/@Algorithm[.='http://www.w3.org/TR/2001/REC-xml-c14n-20010315']"> 
      <xsl:attribute name="Algorithm"> 
       <xsl:value-of select="'http://www.w3.org/2001/10/xml-exc-c14n#'"/> 
      </xsl:attribute> 
     </xsl:template> 
    </xsl:stylesheet> 

Können Sie bitte lassen Sie mich wissen, was ist das Problem in diesem XSL.

+0

Mögliches Duplikat von [Übereinstimmende Elemente mit Namespacepräfix in XSLT] (https://stackoverflow.com/questions/5100724/matching-elements-with-namespace-prefix-in-xslt) – Filburt

+0

Können Sie mir bitte Bescheid geben. Wie können wir das Problem lösen? – user5458829

+0

Haben Sie den verlinkten Beitrag und die Antworten * gelesen? – Filburt

Antwort

1

Sie haben Namespaces in Ihrem XSLT nicht berücksichtigt. In Ihrem aktuellen XML, ist es fast sicher eine Namespace-Deklaration (wahrscheinlich auf dem Wurzelelement), der Form ...

xmlns:ds="http://..." 

(Wenn nicht, dann ist Ihr XML nicht konform Namespace und gewonnen kann nicht von XSLT verarbeitet werden.

Das bedeutet, das Element Transform gehört zu diesem Namespace in Ihrem XML, aber Ihre XSLT sucht nach einem Element namens Transform in keinem Namespace.

Was Sie tun müssen, ist die Namespace-Deklaration zu Ihrem XSLT hinzufügen, und verwenden Sie den ds Präfix vor dem Transform Namen im Spiel

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:ds="http://..."> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="ds:Transform/@Algorithm[.='http://www.w3.org/TR/2001/REC-xml-c14n-20010315']"> 
     <xsl:attribute name="Algorithm"> 
      <xsl:value-of select="'http://www.w3.org/2001/10/xml-exc-c14n#'"/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

HINWEIS Diese aktuelle XSLT ist für ein Attribut suchen mit dem Wert http://www.w3.org/TR/2001/REC-xml-c14n-20010315, der in Ihrem XML-Beispiel nicht angezeigt wird.

Verwandte Themen