如何使用xsl从xml转换为json并删除项目/记录标签

时间:2016-08-01 14:48:28

标签: json xml xslt xslt-1.0 transformation

感谢Tim C在how transform from xml based on attributes to json and ignore the attributes from especific elements by using XSLT/XSL中提供的优秀答案,我可以学习如何将输入xml转换为json并在转换期间排除项属性。请注意,请参阅下面的输入xml文件。

请问,我怎样才能进行完全相同的转换,但忽略了" aa"和" bbb"在输出json?我的意思是,在我的情况下,如何在xml转换期间将json记录为名为aa和bbb的记录标识符?

在我的现实世界中,aa将始终是两个数字(例如99)代表某些类型的项目,bbb将始终是三个数字(例如999)代表其他类型的项目。每种产品都是一些aa加上一些bbb类型产品的总和。由于数字的数字确切地告诉我它是类型还是bbb类型,我知道我可以从json和我的业务角度得到一个json otuput文件有效,而没有" aa"和" bbb"词语的

输入文件:

<c:product xmlns:c="myapp">
       <c:item cod="789">
              <c:aa name="024" value="123"/>
              <c:bbb name="0105" value="123456"/>
              <c:bbb name="0122" value="T"/>
              <c:aa name="071" value="00000001"/>
       </c:item>
       <c:item package="123" cod="11111">
              <c:aa name="002" value="753"/>
              <c:aa name="003" value="456"/>
              <c:bbb name="0146" value="147852"/>
       </c:item>
</c:product>

应用当前XSL时的当前输出文件:

[
  {
    "aa" : {"024":"123"},
    "bbb" : {"0105":"123456"},
    "bbb" : {"0122":"T"},
    "aa" : {"071":"00000001"}
  },
  {
    "aa" : {"002":"753"},
    "aa" : {"003":"456"},
    "bbb" : {"0146":"147852"}
  }
]

我目前的XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0" 
                xmlns:c="myapp" exclude-result-prefixes="c">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[c:item]">
    <xsl:text>[&#10;</xsl:text>
    <xsl:apply-templates select="c:item"/>
    <xsl:text>]&#10;</xsl:text>
</xsl:template>

<xsl:template match="c:item">
    <xsl:text>  {&#10;</xsl:text>
        <xsl:apply-templates />
    <xsl:text>  }</xsl:text>
    <xsl:if test="following-sibling::c:item">
        <xsl:text>,</xsl:text>
    </xsl:if>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="c:item/*">
        <xsl:text>    "</xsl:text>
        <xsl:value-of select="local-name()" />
        <xsl:text>" : {"</xsl:text>
        <xsl:value-of select="@name" />
        <xsl:text>":"</xsl:text><xsl:value-of select="@value" />
        <xsl:text>"}</xsl:text>
        <xsl:if test="following-sibling::*">
            <xsl:text>,</xsl:text>
        </xsl:if>
        <xsl:text>&#10;</xsl:text>
</xsl:template>
</xsl:stylesheet>

我想要的输出,我理解它是商业和json模式有效:

[
  {
    {"024":"123"},
    {"0105":"123456"},
    {"0122":"T"},
    {"071":"00000001"}
  },
  {
    {"002":"753"},
    {"003":"456"},
    {"0146":"147852"}
  }
]

1 个答案:

答案 0 :(得分:0)

您提供的预期输出不是有效的JSON。也许你想要这样的东西

[
  {
    "024":"123",
    "0105":"123456",
    "0122":"T",
    "071":"00000001"
  },
  {
    "002":"753",
    "003":"456",
    "0146":"147852"
  }
]

以此为目标,可以直接调整XSLT以产生所需的结果。唯一的更改是更改与c:item/*匹配的模板,以删除local-name()的输出(输出元素的名称; aaabb等)和周围的牙箍。

试试这个XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0" 
                xmlns:c="myapp" exclude-result-prefixes="c">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*[c:item]">
    <xsl:text>[&#10;</xsl:text>
    <xsl:apply-templates select="c:item"/>
    <xsl:text>]&#10;</xsl:text>
</xsl:template>

<xsl:template match="c:item">
    <xsl:text>  {&#10;</xsl:text>
        <xsl:apply-templates />
    <xsl:text>  }</xsl:text>
    <xsl:if test="following-sibling::c:item">
        <xsl:text>,</xsl:text>
    </xsl:if>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="c:item/*">
        <xsl:text>    "</xsl:text>
        <xsl:value-of select="@name" />
        <xsl:text>":"</xsl:text><xsl:value-of select="@value" />
        <xsl:text>"</xsl:text>
        <xsl:if test="following-sibling::*">
            <xsl:text>,</xsl:text>
        </xsl:if>
        <xsl:text>&#10;</xsl:text>
</xsl:template>
</xsl:stylesheet>

花点时间研究这个答案,了解每个部分正在做什么。使用http://xsltransform.net/修改XSLT会有所帮助,因为您可以轻松查看每个更改的结果。