gpt4 book ai didi

java - xslt 和循环中的变量

转载 作者:行者123 更新时间:2023-12-02 09:51:34 25 4
gpt4 key购买 nike

我有以下 xml

<Request>
<Record>
<ID>123456789</ID>
<OtherID>ABC123</OtherID>
<Title>Example</Title>
<Properties>
<Attribute type="Main">
<Name>Description</Name>
<Value>This is an example</Value>
</Attribute>
<Attribute type="Main">
<Name>Source</Name>
<Value>A1</Value>
</Attribute>
<Attribute type="Main">
<Name>Source</Name>
<Value>B</Value>
</Attribute>
<Attribute type="Main">
<Name>Represenative</Name>
<Value>Mike</Value>
</Attribute>
<Attribute type="Main">
<Name>Animal</Name>
<Value>Elephant</Value>
</Attribute>
</Properties>
</Record>
</Request>

我想要以下 json。

{
"Record":{
"ID":"123456789",
"OtherID":"ABC123",
"Title":"Example",
"Properties":[
{
"Type":"Main",
"Value":"Source",
"Name":"A1"
},
{
"Type":"Main",
"Value":"Source",
"Name":"B"
},
{
"Type":"Main",
"Value":"Representative",
"Name":"Mike"
},
{
"Type":"Main",
"Value":"Animal",
"Name":"Elephant"
}
],
"Description":"This is an example"
}
}

请注意,description 属性不是数组的一部分,它与属性、ID、OtherID 和 Title 处于同一级别。

我正在应用以下 xslt 将 xml 转换为 json。在此 xml 中,我声明了一个变量,它将包含描述并将添加到对象的末尾

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0">
<xsl:output method="text" />

<xsl:template match="/">
<xsl:variable name="description2" select="''" />
{
<xsl:for-each select="Request/Record">
"Record": {
"ID":"<xsl:value-of select="ID" />",
"OtherId": "<xsl:value-of select="OtherID" />",
"Title":"Example",
<xsl:if test="Properties">
"Properties": [
<xsl:for-each select="Properties/Attribute">
<xsl:if test="soi:Name = 'Description'">
<xsl:variable name="description2" select="<xsl:value-of select="Value" />" />
<xsl:if test="position() != last()">,</xsl:if>
</xsl:if>
<xsl:if test="Name != 'Description'">
{
"Type": "Main",
"Name": "<xsl:value-of select="Name" />",
"Value": "<xsl:value-of select="Value" />"
}
<xsl:if test="position() != last()">,</xsl:if>
</xsl:if>

</xsl:for-each>
]
</xsl:if>
}<xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>
<xsl:if test="description2!=''">
,"Description":"<xsl:value-of select="$description2"/>"
</xsl:if>
}
</xsl:template>

不幸的是,我得到了这个输出

{
"Request":{
"ID":"123456789",
"OtherID":"ABC123",
"Title":"Example",
"Properties":[
{
"Type":"Main",
"Value":"Source",
"Name":"A1"
},
{
"Type":"Main",
"Value":"Source",
"Name":"B"
},
{
"Type":"Main",
"Value":"Representative",
"Name":"Mike"
},
{
"Type":"Main",
"Value":"Animal",
"Name":"Elephant"
}
],
"Description":""
}
}

description 的值为空,因为我不知道如何在循环中重新分配变量description 的值。我使用双循环来获取描述,但效率非常低。

欢迎任何建议

提前致谢。

最佳答案

在 XSLT 3(适用于 Saxon 9.8 或更高版本以及 AltovaXML 2017 R3 及更高版本)中,您可以简单地将 XML 转换为 xml-to-json 函数 https://www.w3.org/TR/xpath-functions/#func-xml-to-json 所用的 XML 格式。期望然后应用该函数:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns="http://www.w3.org/2005/xpath-functions"
expand-text="yes"
exclude-result-prefixes="#all"
version="3.0">

<xsl:output method="text"/>

<xsl:template match="Request">
<xsl:variable name="json-xml">
<map>
<xsl:apply-templates/>
</map>
</xsl:variable>
<xsl:value-of select="xml-to-json($json-xml, map { 'indent' : true() })"/>
</xsl:template>

<xsl:template match="Record">
<map key="{local-name()}">
<xsl:apply-templates/>
</map>
</xsl:template>

<xsl:template match="ID | OtherID | Title">
<string key="{local-name()}">{.}</string>
</xsl:template>

<xsl:template match="Properties">
<array key="{local-name()}">
<xsl:apply-templates select="Attribute[not(Name = 'Description')]"/>
</array>
<string key="Description">{Attribute[Name = 'Description']/Value}</string>
</xsl:template>

<xsl:template match="Attribute">
<map>
<xsl:apply-templates select="@type, Value, Name"/>
</map>
</xsl:template>

<xsl:template match="Attribute/@* | Attribute/*">
<string key="{local-name()}">{.}</string>
</xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bnnZWz/2

区分 Attribute[not(Name = 'Description')]Attribute[Name = 'Description']/Value 的相同选择当然也有助于你的原始代码。

关于java - xslt 和循环中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56290890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com