Нужна помощь в XSLT-коде для изменения пространства имен [duplicate]

Используйте функцию callback() внутри успеха foo(). Попробуйте таким образом. Это просто и легко понять. & nbsp;

var lat = "";
var lon = "";
function callback(data) {
    lat = data.lat;
    lon = data.lon;
}
function getLoc() {
    var url = "http://ip-api.com/json"
    $.getJSON(url, function(data) {
        callback(data);
    });
}

getLoc();
1
задан Kirill Polishchuk 25 May 2015 в 05:26
поделиться

2 ответа

С учетом ваших пояснений в комментариях я бы предложил:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://my.ns.uri">
<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
    <xsl:element name="ns:{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

<xsl:template match="*[@*]">
    <xsl:element name="ns:{local-name()}">
        <xsl:element name="ns:{local-name()}">
            <xsl:apply-templates/>
        </xsl:element>
        <xsl:apply-templates select="@*"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:element name="ns:{local-name()}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

В чем разница?

При применении к следующий пример ввода:

XML

<lm:GetInvoiceList xmlns:lm="http://www.w3.org">
   <lm:Response>
      <lm:Bill>
         <lm:BillPropertyA subPropertyA="first subproperty">first property</lm:BillPropertyA>
         <lm:BillPropertyB subPropertyB="second subproperty"/>
         <lm:BillPropertyC>second property</lm:BillPropertyC>
      </lm:Bill>
   </lm:Response>
</lm:GetInvoiceList>

результат будет:

<ns:GetInvoiceList xmlns:ns="http://my.ns.uri">
   <ns:Response>
      <ns:Bill>
         <ns:BillPropertyA>
            <ns:BillPropertyA>first property</ns:BillPropertyA>
            <ns:subPropertyA>first subproperty</ns:subPropertyA>
         </ns:BillPropertyA>
         <ns:BillPropertyB>
            <ns:BillPropertyB/>
            <ns:subPropertyB>second subproperty</ns:subPropertyB>
         </ns:BillPropertyB>
         <ns:BillPropertyC>second property</ns:BillPropertyC>
      </ns:Bill>
   </ns:Response>
</ns:GetInvoiceList>

в отличие от:

<ns:GetInvoiceList xmlns:ns="http://my.ns.uri">
   <ns:Response>
      <ns:Bill>
         <ns:BillPropertyA>
            <ns:subPropertyA>first subproperty</ns:subPropertyA>
            <ns:BillPropertyA>first property</ns:BillPropertyA>
         </ns:BillPropertyA>
         <ns:BillPropertyB>
            <ns:subPropertyB>second subproperty</ns:subPropertyB>
         </ns:BillPropertyB>
         <ns:BillPropertyC>
            <ns:BillPropertyA>second property</ns:BillPropertyA>
         </ns:BillPropertyC>
      </ns:Bill>
   </ns:Response>
</ns:GetInvoiceList>

, который неправильно помещает текстовый узел «второго свойства» в другой экземпляр ns:BillPropertyA и делает дочерний элемент ns:BillPropertyC.

Примечания:

  1. Если вы хотите для изменения пространства имен узла вы не можете использовать xsl:copy, так как это также скопирует существующее пространство имен;
  2. Вы можете (и должны) объявить пространство имен один раз, а затем использовать уже существующее связывание, когда это необходимо ,
2
ответ дан michael.hor257k 27 August 2018 в 06:07
поделиться

Попробуйте этот XSLT:

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

  <xsl:template match="*">
    <xsl:element name="ns:{local-name()}" namespace="http://my.ns.uri">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="text()">
    <xsl:element name="ns:{local-name(../../*)}" namespace="http://my.ns.uri">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:element name="ns:{local-name()}" namespace="http://my.ns.uri">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Выход:

<ns:GetInvoiceList xmlns:ns="http://my.ns.uri">
  <ns:Response>
    <ns:Bill>
      <ns:BillStatusCode>
        <ns:typecode>1</ns:typecode>
        <ns:BillStatusCode>type description</ns:BillStatusCode>
      </ns:BillStatusCode>
      <ns:EBillProcessStatusCode>
        <ns:typecode>2</ns:typecode>
        <ns:BillStatusCode>type description</ns:BillStatusCode>
      </ns:EBillProcessStatusCode>
      <ns:BillCycleCode>
        <ns:typecode>1</ns:typecode>
        <ns:BillStatusCode>type description</ns:BillStatusCode>
      </ns:BillCycleCode>
      <ns:BillActivityCode>
        <ns:typecode>3</ns:typecode>
        <ns:BillStatusCode>type description</ns:BillStatusCode>
      </ns:BillActivityCode>
      <ns:ToDate>
        <ns:BillStatusCode>...</ns:BillStatusCode>
      </ns:ToDate>
    </ns:Bill>
  </ns:Response>
</ns:GetInvoiceList>
1
ответ дан Kirill Polishchuk 27 August 2018 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: