【问题标题】:not able to generate desired JSON using XSLT无法使用 XSLT 生成所需的 JSON
【发布时间】:2014-11-15 07:37:00
【问题描述】:

我正在尝试通过使用 XSLT 从现有 XML 获取数据来创建 JSON 格式,但我没有得到所需的输出。

XML 输入

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
   <Header>
      <MessageId>{FB6E5FF6-AA89-4E56-8079-AFF7BAB84486}</MessageId>
      <Action>http://tempuri.org/AIFTrialQueryService/find</Action>
   </Header>
   <Body>
      <MessageParts>
         <AIFTrialQuery xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/AIFTrialQuery">
            <SMAStageTable_1 class="entity">
               <StageId>Closed</StageId>
               <StageDescription>Closed</StageDescription>
            </SMAStageTable_1>
            <SMAStageTable_1 class="entity">
               <StageId>In Process</StageId>
               <StageDescription>In Process</StageDescription>
            </SMAStageTable_1>
            <SMAStageTable_1 class="entity">
               <StageId>Open</StageId>
               <StageDescription>Open</StageDescription>
            </SMAStageTable_1>
         </AIFTrialQuery>
      </MessageParts>
   </Body>
</Envelope>

XSLT 输入

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text" encoding="utf-8" indent="no"/>

  <xsl:template match="/">
     <xsl:apply-templates match="Envelope"/>  
  </xsl:template>           

<xsl:template match="AIFTrialQuery">

 {
            'Items': [
                <xsl:for-each select="SMAStageTable_1">
                    {
                        'status': '<xsl:value-of select="StageId"/>',
                        'statusName': '<xsl:value-of select="StageDescription"/>'

                    },
                </xsl:for-each>
            ]
        }

</xsl:template>

输出我得到的完全不受欢迎的输出

{FB6E5FF6-AA89-4E56-8079-AFF7BAB84486}
http://tempuri.org/AIFTrialQueryService/find
Closed
Closed
In Process
In Process
Open
Open

预期输出为

 {
                'Items': [

                        {
                            'status': 'Closed',
                            'statusDescription': 'Closed'

                        },
            {
                            'status': 'Closed',
                            'statusDescription': 'Closed'

                        },

            {
                            'status':  'In Process'
                            'statusDescription':  'In Process'

                        }

                ]
}

【问题讨论】:

    标签: xml json xslt


    【解决方案1】:

    希望对你有帮助

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:myUtils="pda:MyUtils" 
                xmlns:AIF="http://schemas.microsoft.com/dynamics/2008/01/documents/AIFTrialQuery" 
                xmlns:Env="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
    <xsl:output method="text" encoding="utf-8"/>
    <xsl:template match="/">
      <xsl:apply-templates select="Env:Envelope/Env:Body/Env:MessageParts/AIF:AIFTrialQuery"/>
    </xsl:template>
    <xsl:template match="AIF:AIFTrialQuery">
      {
      'Items': [
       <xsl:for-each select="AIF:SMAStageTable_1">
        {
         'status': '<xsl:value-of select="AIF:StageId"/>',
         'statusName': '<xsl:value-of select="AIF:StageDescription"/>'
    
        },
       </xsl:for-each>
      ]
     }
    </xsl:template>
    

    这对我有用。 我认为您必须提及元素节点关联到的名称空间,以便 xslt 解析器定位元素。

    【讨论】:

    • 是的,它可以工作,但你能分享一下你是如何找到 AX 的命名空间的吗?
    • 如果您的意思是“动态 axapta”,则按 AX,那么您的 xml 包含该信息。
    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多