如何使用 xsl 从 xml 转换为 json 并删除 item/record 标签
how transform from xml to json with xsl and removing the item/record labels
感谢 Tim C 在 中提供的出色答案,我可以学习如何将我的输入 xml 转换为 json 并在转换期间排除项目属性。请参阅下面的输入 xml 文件。
拜托,我怎样才能做完全相同的转换,但忽略输出 json 中的 "aa" 和 "bbb"?我的意思是,在 xml 转换为 json 的过程中,我如何排除名为 aa 和 bbb 的记录标识符?
在我的现实世界中,aa 始终是两位数字(例如 99)代表某种类型的项目,而 bbb 始终是三位数字(例如 999)代表其他类型的项目。每个产品都是一些 aa 加上一些 bbb 类型产品的总和。由于数字的数量准确地告诉我它是 aa 类型还是 bbb 类型,我知道我可以有一个 json otuput 文件从 json 和我的业务角度来看都有效,而没有 "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>[ </xsl:text>
<xsl:apply-templates select="c:item"/>
<xsl:text>] </xsl:text>
</xsl:template>
<xsl:template match="c:item">
<xsl:text> { </xsl:text>
<xsl:apply-templates />
<xsl:text> }</xsl:text>
<xsl:if test="following-sibling::c:item">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
据我所知,我想要的输出既是业务又是 json 模式有效:
[
{
{"024":"123"},
{"0105":"123456"},
{"0122":"T"},
{"071":"00000001"}
},
{
{"002":"753"},
{"003":"456"},
{"0146":"147852"}
}
]
您给出的预期输出无效 JSON。也许你想要这样的东西
[
{
"024":"123",
"0105":"123456",
"0122":"T",
"071":"00000001"
},
{
"002":"753",
"003":"456",
"0146":"147852"
}
]
以此为目标,可以直接调整 XSLT 以产生所需的结果。唯一的变化是更改匹配 c:item/*
的模板以删除 local-name()
的输出(输出元素的名称;aaa
、bb
等)和周围的大括号。
试试这个 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>[ </xsl:text>
<xsl:apply-templates select="c:item"/>
<xsl:text>] </xsl:text>
</xsl:template>
<xsl:template match="c:item">
<xsl:text> { </xsl:text>
<xsl:apply-templates />
<xsl:text> }</xsl:text>
<xsl:if test="following-sibling::c:item">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
一定要花时间研究这个答案,了解每个部分在做什么。使用 http://xsltransform.net/ 修改 XSLT 会有所帮助,因为您可以轻松地查看每次更改的结果。
感谢 Tim C 在
拜托,我怎样才能做完全相同的转换,但忽略输出 json 中的 "aa" 和 "bbb"?我的意思是,在 xml 转换为 json 的过程中,我如何排除名为 aa 和 bbb 的记录标识符?
在我的现实世界中,aa 始终是两位数字(例如 99)代表某种类型的项目,而 bbb 始终是三位数字(例如 999)代表其他类型的项目。每个产品都是一些 aa 加上一些 bbb 类型产品的总和。由于数字的数量准确地告诉我它是 aa 类型还是 bbb 类型,我知道我可以有一个 json otuput 文件从 json 和我的业务角度来看都有效,而没有 "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>[ </xsl:text>
<xsl:apply-templates select="c:item"/>
<xsl:text>] </xsl:text>
</xsl:template>
<xsl:template match="c:item">
<xsl:text> { </xsl:text>
<xsl:apply-templates />
<xsl:text> }</xsl:text>
<xsl:if test="following-sibling::c:item">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
据我所知,我想要的输出既是业务又是 json 模式有效:
[
{
{"024":"123"},
{"0105":"123456"},
{"0122":"T"},
{"071":"00000001"}
},
{
{"002":"753"},
{"003":"456"},
{"0146":"147852"}
}
]
您给出的预期输出无效 JSON。也许你想要这样的东西
[
{
"024":"123",
"0105":"123456",
"0122":"T",
"071":"00000001"
},
{
"002":"753",
"003":"456",
"0146":"147852"
}
]
以此为目标,可以直接调整 XSLT 以产生所需的结果。唯一的变化是更改匹配 c:item/*
的模板以删除 local-name()
的输出(输出元素的名称;aaa
、bb
等)和周围的大括号。
试试这个 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>[ </xsl:text>
<xsl:apply-templates select="c:item"/>
<xsl:text>] </xsl:text>
</xsl:template>
<xsl:template match="c:item">
<xsl:text> { </xsl:text>
<xsl:apply-templates />
<xsl:text> }</xsl:text>
<xsl:if test="following-sibling::c:item">
<xsl:text>,</xsl:text>
</xsl:if>
<xsl:text> </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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
一定要花时间研究这个答案,了解每个部分在做什么。使用 http://xsltransform.net/ 修改 XSLT 会有所帮助,因为您可以轻松地查看每次更改的结果。