替换XML中的属性值

时间:2017-06-28 13:22:35

标签: xslt

我有一个传入的XMl,如果它有一个特定的值,我想要替换属性的值。属性的父元素"算法"是"变换"这是XML中的许多这样的节点

传入XML:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type GSSS struct {
    Version string `json:"version"`
    Feed GSSSfeed `json:"feed"`
}

type GSSSfeed struct {
    TITLE   GSSTitle `json:"title"`
    // Entry   []GSSSEntry `json:"entry"`
}
type GSSTitle struct {
    T string `json:"$t"`
}

func main() {
    url01 := "https://spreadsheets.google.com/feeds/list/168xdxefP3gGnrTGg2hwJoeRVfmbEuTB5plFTyd6I5Qo/1/public/values?alt=json"
    //url02 := "https://spreadsheets.google.com/feeds/list/168xdxefP3gGnrTGg2hwJoeRVfmbEuTB5plFTyd6I5Qo/2/public/values?alt=json"
    //url03 := "https://spreadsheets.google.com/feeds/list/168xdxefP3gGnrTGg2hwJoeRVfmbEuTB5plFTyd6I5Qo/3/public/values?alt=json"
    //url04 := "https://spreadsheets.google.com/feeds/list/168xdxefP3gGnrTGg2hwJoeRVfmbEuTB5plFTyd6I5Qo/4/public/values?alt=json"
    //url05 := "https://spreadsheets.google.com/feeds/list/168xdxefP3gGnrTGg2hwJoeRVfmbEuTB5plFTyd6I5Qo/5/public/values?alt=json"
    println("=============  starting main =============")

    // res, err := http.Get("https://www.citibikenyc.com/stations/json")
    res, err := http.Get(url01)
    if err != nil {
        panic(err.Error())
    }

    // body, err := ioutil.ReadAll(res.Body)
    // if err != nil {
    //  panic(err.Error())
    // }

    var m GSSS
    // err := json.Unmarshal(body, &m)
    //json.NewDecoder(res.Body).Decode(&m)
    // json.NewDecoder([]byte(body)).Decode(&m)

    // json.NewDecoder([]byte(res.Body)).Decode(&m)
    json.NewDecoder(res.Body).Decode(&m)

    //err := json.Unmarshal([]byte(body), &m)
    if err != nil {
        fmt.Println("Whoops...:", err)
    }

    fmt.Println("============  about to print m3 ============")
    fmt.Println(m)
    fmt.Println("============  about to print m4 ============")
}

XSL:

<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的问题。

1 个答案:

答案 0 :(得分:1)

您尚未考虑XSLT中的命名空间。在您的实际XML中,几乎可以肯定有一个名称空间声明(可能在根元素上),形式为......

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

(如果没有,那么您的XML不符合名称空间,并且无法通过XSLT处理。)

这意味着元素Transform属于XML中的该命名空间,但您的XSLT正在寻找一个名为Transform的元素,而不是命名空间。

您需要做的是将命名空间声明添加到XSLT,并在匹配中使用ds前面的Transform前缀

<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>

请注意,此当前XSLT正在查找值http://www.w3.org/TR/2001/REC-xml-c14n-20010315的属性,该属性实际上未显示在示例XML中。