在 postgre sql 中使用 xml 输入时值不匹配

Mismatch of values when using xml input in postgre sql

我想创建一个 xml 格式,以便我可以在存储过程的输入中使用它,但是来自 select 查询的结果不是我的输出 expecting.Could 你能帮我解决这个问题吗?

WITH test_xml(data) AS (VALUES
('<ROOT>
<record Modelid="1" ModelName="Paul" description="abc" Productid="1"      Modelprice="120987">
    <record variationid="20" VariationName="1abc" Variationimage="1abc" variationdesc="1variationdesc">
      <item layerid="11" layeris="layer1.js"></item>
      <item layerid="12" layeris="layer2.js"></item>
    </record>
    <record variationid="21" VariationName="2abc" Variationimage="2abc" variationdesc="2variationdesc">
      <item layerid="13" layeris="layer3.js"></item>
      <item layerid="14" layeris="layer4.js"></item>
    </record>
</record>
</ROOT>'::XML)
)
SELECT  unnest((xpath('//record/@Modelid', test_xml.data))) as Modelid ,
unnest((xpath('//record/record/@variationid', test_xml.data))) as     variationid,
unnest((xpath('//record/record/item/@layerid', test_xml.data))) as layerid
FROM test_xml

输出为:

modelid variationid layerid 1 20 11 1 21 12 1 20 13 1 21 14

但我想要的正是

modelid variationid layerid 1 20 11 1 20 12 1 21 13 1 21 14

尝试以下操作:

WITH test_xml(data) AS (VALUES
('<ROOT>
<record Modelid="1" ModelName="Paul" description="abc" Productid="1" Modelprice="120987">
    <record variationid="20" VariationName="1abc" Variationimage="1abc" variationdesc="1variationdesc">
      <item layerid="11" layeris="layer1.js"></item>
      <item layerid="12" layeris="layer2.js"></item>
    </record>
    <record variationid="21" VariationName="2abc" Variationimage="2abc" variationdesc="2variationdesc">
      <item layerid="13" layeris="layer3.js"></item>
      <item layerid="14" layeris="layer4.js"></item>
    </record>
</record>
</ROOT>'::XML)
)
SELECT
   (xpath('//record/@Modelid', models.data))[1] AS modelid,
   (xpath('//record/@variationid', variations.data))[1] AS variationid,
   (xpath('//item/@layerid', layers.data))[1] AS layerid
FROM test_xml
   JOIN LATERAL unnest(xpath('//record', test_xml.data)) models(data) ON TRUE
   JOIN LATERAL unnest(xpath('//record/record', models.data)) variations(data) ON TRUE
   JOIN LATERAL unnest(xpath('//record/item', variations.data)) layers(data) ON TRUE;