XSLT TO JSON C# - PullRequest
       5

XSLT TO JSON C#

0 голосов
/ 10 марта 2020

Я пытаюсь преобразовать XML в Json с использованием XSLT, после того, как используются XSLT и xml, по какой-то причине он пропускает массив и рассматривает все объекты массива как один объект,

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

      <xsl:template match="/">
        {
        <xsl:apply-templates select="*"/>}
      </xsl:template>

      <!-- Object or Element Property-->
      <xsl:template match="*">
        "<xsl:value-of select="name()"/>" :<xsl:call-template name="Properties">
          <xsl:with-param name="parent" select="'Yes'"> </xsl:with-param>
        </xsl:call-template>
      </xsl:template>

      <!-- Array Element -->
      <xsl:template match="*" mode="ArrayElement">
        <xsl:call-template name="Properties"/>
      </xsl:template>

      <!-- Object Properties -->
      <xsl:template name="Properties">
        <xsl:param name="parent"></xsl:param>
        <xsl:variable name="childName" select="name(*[1])"/>
        <xsl:choose>
          <xsl:when test="not(*|@*)">
            <xsl:choose>
              <xsl:when test="$parent='Yes'">
                <xsl:text>&quot;</xsl:text>
                <xsl:value-of select="."/>
                <xsl:text>&quot;</xsl:text>
              </xsl:when>
              <xsl:otherwise>
                "<xsl:value-of select="name()"/>":"<xsl:value-of  select="."/>"
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:when test="count(*[name()=$childName]) > 1">
            { "<xsl:value-of  select="$childName"/>" :[<xsl:apply-templates select="*" mode="ArrayElement"/>] }
          </xsl:when>
          <xsl:otherwise>
            {
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates select="*"/>
            }
          </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="following-sibling::*">,</xsl:if>
      </xsl:template>

      <!-- Attribute Property -->
      <xsl:template match="@*">
        "<xsl:value-of select="name()"/>" : "<xsl:value-of select="."/>",
      </xsl:template>
    </xsl:stylesheet>   

Со следующим XML

    <Customers>
      <docNo>IN190168478</docNo>
      <Customered Id="99">
        <Name>Bob</Name>
        <Age>39</Age>
        <Address>
          <Street>10 Idle Lane</Street>
          <City>Yucksville</City>
          <PostalCode>xxxyyy</PostalCode>
        </Address>
      </Customered>
      <Customered Id="101">
        <Name>Bill</Name>
        <Age>39</Age>
        <Address>
          <Street>10 Idle Lane</Street>
          <City>Yucksville</City>
          <PostalCode>xxxyyy</PostalCode>
        </Address>
      </Customered>

    </Customers>

Ожидаемое Json должно быть

    {
    "Customers": {

        "docNo": "IN190168478"
    },
    "Customered": [{
            "Id": "99",
            "Name": "Bob",
            "Age": "39",
            "Address": {
                "Street": "10 Idle Lane",
                "City": "Yucksville",
                "PostalCode": "xxxyyy"
            }
        },
        {
            "Id": "101",
            "Name": "Bill",
            "Age": "39",
            "Address": {
                "Street": "10 Idle Lane",
                "City": "Yucksville",
                "PostalCode": "xxxyyy"
            }
        }
    ]
}

, но я получаю следующее jSon,

    {{
      "Customers": {
        "docNo": "IN190168478",
        "Customered": {
          "Id": "101",
          "Name": "Bill",
          "Age": "39",
          "Address": {
            "Street": "10 Idle Lane",
            "City": "Yucksville",
            "PostalCode": "xxxyyy"
          }
        }
      }
    }}

Он получает только последний дочерний элемент массива и переписывает его на весь предыдущий, я конвертирую его, используя c#

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