XSLT конвертировать XML в JSON - PullRequest
       0

XSLT конвертировать XML в JSON

0 голосов
/ 23 октября 2018

Я новичок в xslt и столкнулся с проблемой при попытке конвертировать xml в Json.Основная проблема в том, что я не могу обновить переменные внутри цикла. Итак, я должен разобраться с множителями. Есть мысли?Спасибо!

ввод xml:

<attributes>
 <name>uid</name>
 <values>user123</values>
 <name>mail</name>
 <values>xxxxxxxxxxxxxx</values>
 <name>ismemberof</name>
 <values>cn=Partner xxxxxxxxxxxxxxxxxx dc=com</values>
 <values>cn=Partner zzzzzzzzzzzzzzzzzzz dc=com</values>
 <values>ccn=Partner 444444444444444 dc=com</values>
 <values>cn=MANSFIELD MEDICAL,teste teste</values>
 <values>cn=Partner Portal - hthththththththt</values>
<name>dn</name>
<values>uid=user123,ou=people,dc=tttt,dc=com</values>
<name>telephoneNumber</name>
<name>objectClass</name>
<values>person</values>
<values>inetorgperson</values>
<values>dspswuser</values>
<values>top</values>
</attributes>

Мой xslT-код:

<xsl:template match="/">    
<xsl:for-each select = "attributes/*">    
<xsl:if test = "(name(.) = 'name')"> 
<xsl:value-of select="concat(text(),':[&quot;')" />    
  </xsl:if>
 <xsl:if test = "(name(.) = 'values')">     
    <xsl:value-of select="concat(text(),'&quot;],')" />    
</xsl:if>    
</xsl:for-each>     
</xsl:template> 

Ожидаемый результат:

{
    "username": "bjensen",
       "realm": "/",
       "uid": [
           "bjensen"
       ],
       "mail": [
           "bjensen@example.com"
       ],
       "sn": [
           "bjensen"
       ],    
       "dn": [
           "uid=bjensen,ou=people,dc=openam,dc=forgerock,dc=org"
       ],
       "objectclass": [
           "person",
           "sunIdentityServerLibertyPPService",
           "sunFederationManagerDataStore",
            "top"
       ],
       "universalid": [
           "id=bjensen,ou=user,dc=openam,dc=forgerock,dc=org"
       ]
}

1 Ответ

0 голосов
/ 24 октября 2018

Не совсем понятно, какой у вас формат ввода и как вы хотите отобразить его в JSON, но часть представленных вами данных выглядит так, как будто вы можете использовать for-each-group select="*" group-starting-with="name" для дочерних элементов attributes элемента:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-skip"/>

  <xsl:output method="json" indent="yes"/>

  <xsl:template match="attributes">
      <xsl:map>
          <xsl:for-each-group select="*" group-starting-with="name">
              <xsl:map-entry key="." select="array { data(tail(current-group())) }"/>
          </xsl:for-each-group>
      </xsl:map>
  </xsl:template>

</xsl:stylesheet>

Предполагается, что процессор XSLT 3, такой как Saxon 9.8 или 9.9, или Altova XML 2017, или 2018, или 2019, будет для вашего ввода давать результат в формате JSON, например

 {
  "dn": [
    "uid=user123,ou=people,dc=tttt,dc=com"
   ],
  "telephoneNumber": [

   ],
  "uid": [
    "user123"
   ],
  "mail": [
    "xxxxxxxxxxxxxx"
   ],
  "objectClass": [
    "person",
    "inetorgperson",
    "dspswuser",
    "top"
   ],
  "ismemberof": [
    "cn=Partner xxxxxxxxxxxxxxxxxx dc=com",
    "cn=Partner zzzzzzzzzzzzzzzzzzz dc=com",
    "ccn=Partner 444444444444444 dc=com",
    "cn=MANSFIELD MEDICAL,teste teste",
    "cn=Partner Portal - hthththththththt"
   ]
 }

*.1010 * -development.net / 3NzcBtX

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...