如何从 XML 有效负载中读取特定字段,其中此有效负载将再次出现在主 XML 有效负载的字段中

How to read the specific fields from the XML payload, where this payload is coming again in the field of the main XML payload

提问人:Nikita 提问时间:10/13/2023 最后编辑:Nikita 更新时间:10/13/2023 访问量:89

问:

需要帮助来读取进入其中一个字段的 XML 有效负载。

请求负载:

<?xml version="1.0" encoding="UTF-8"?>
<Code xmlns:ns0="http://example.com">
   <Header>
      <Field1>111</Field1>
      <Field2>text</Field2>
   </Header>
   <Trailer>
     &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
        <Field4>
            <Field5>
               <Field6>Age</Field6>
                 <Field7>Location</Field7>
               <Field6>Age</Field6>
                 <Field7>Location</Field7>
            </Field5>
        </Field4>
   </Trailer>
</Code>

上面是请求 XML 有效负载,我们在其中调用了字段,我们再次获取 XML 有效负载。我们只需要获取 从字段中的 XML 有效负载中选择的字段 并生成下面的输出。<Trailer><Trailer>

预期输出有效载荷:

<?xml version="1.0" encoding="UTF-8"?>
<Code xmlns:ns0=http://example.com>
   <Header>
      <Field1>111</Field1>
      <Field2>text</Field2>
   </Header>
   <Field5>
        <Field6>Age</Field6>
            <Field7>Location</Field7>
         <Field6>Age</Field6>
             <Field7>Location</Field7>
    </Field5>
</Code>

我尝试使用下面的XSLT,但我很不幸地从字段中获取必填字段<Trailer>

XSLT 代码:

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<Code>
 <xsl:copy-of select="//Header" />
 <xsl:value-of select="//Trailer" disable-output-escaping="yes"/>

</Code>
</xsl:template>
</xsl:stylesheet>
xslt xslt-3.0 xslt 分组

评论

0赞 John Ernst 10/13/2023
您究竟从哪里获得输出的 Field5 元素中的 EmployeeDetails?员工详细信息不在输入 XML 中。并且它没有在 XSLT 中计算。
1赞 Nikita 10/13/2023
对不起@JohnErnst我的错。我现在已经更正了字段值
1赞 michael.hor257k 10/13/2023
请选择 、 、 标签之一,而不是全部。这与分组有什么关系??xslt-1.0xslt-2.0xslt-3.0
0赞 michael.hor257k 10/13/2023
您确定这是您获得的实际 XML 输入吗?XML 声明似乎不太可能被转义,但以下元素不会。或者不会有根元素包装它们。
0赞 Nikita 10/13/2023
@michael.hor257k:更正了输入和输出有效负载。对此深表歉意

答:

1赞 John Ernst 10/13/2023 #1

试试这个。

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

  <!-- Identity template. -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Trailer">
    <xsl:apply-templates select="Field4/Field5"/>
  </xsl:template>

</xsl:stylesheet>

评论

0赞 Nikita 10/13/2023
非常感谢您的回复 XML 结构 hierarchy 正在破坏,因为 Field6 和 Field7 在 Field5 下。在 XSLT 之后,所有 Field5,6,7 都以相同的 hirerachy 出现.此外,而不是定义 Field5,6 和 7。有没有可能我们只定义 Field5,然后 Field5 下的所有字段都可以自动出现相同的 hirerachy ?
1赞 John Ernst 10/13/2023
预期的输出 XML 格式不正确。Field5 有 2 个结束标记。你能修复它,让我们知道你真正想要的吗?
0赞 John Ernst 10/13/2023
现在试一试。
1赞 y.arazim 10/13/2023 #2

这个问题并不完全清楚。可以使用以下方法产生预期结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Trailer">
    <xsl:apply-templates select="Field4/Field5"/>
</xsl:template>

</xsl:stylesheet>

评论

0赞 Nikita 10/13/2023
非常感谢您的回复 XML 结构 hierarchy 正在破坏,因为 Field6 和 Field7 在 Field5 下。在 XSLT 之后,所有 Field5,6,7 都以相同的 hirerachy 出现.此外,而不是定义 Field5,6 和 7。有没有可能我们只定义 Field5,然后 Field5 下的所有字段都可以自动出现相同的 hirerachy ?
0赞 y.arazim 10/13/2023
我已经编辑了我的答案以匹配您更新的问题。