XSLT映射以在相同顺序中添加丢失的子标签

huangapple go评论47阅读模式
英文:

XSLT mapping to add missing child tags in the same sequence

问题

以下是翻译好的内容:

<emailClick>
<id>1</id>
<url>https://www.google.com</url>
<email_template_id>12</email_template_id>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>
<emailClick>
<id>2</id>
<url>https://www.hello.com</url>
<email_template_id/>
<created_at>2023-02-14 00:00:10</created_at>
</emailClick>

关于你的问题,你已经使用XSLT来实现你的目标,这是一个合理的方法。在你的XSLT样式表中,你遍历了rsp/result/emailClick元素,并为每个元素生成输出。在此过程中,你设置了<email_template_id>元素的值,但如果没有该元素,你生成了<email_template_id/>,这是一个有效的处理方式。

你的XSLT代码在这种情况下似乎已经实现了你的需求,没有明显的问题。如果你的XML结构和要求更加复杂,可能需要进一步优化和改进,但根据你提供的信息,它似乎已经有效了。

英文:

I have the below input xml where some mandatory xml tags are missing like <email_template_id>
which needs to be reproduced in the output in the same sequence

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;rsp stat=&quot;ok&quot; version=&quot;1.0&quot;&gt;
&lt;result&gt;
&lt;total_results&gt;700&lt;/total_results&gt;
&lt;emailClick&gt;
&lt;id&gt;1&lt;/id&gt;
&lt;url&gt;https://www.google.com&lt;/url&gt;
&lt;email_template_id&gt;12&lt;/email_template_id&gt;
&lt;created_at&gt;2023-02-14 00:00:10&lt;/created_at&gt;
&lt;/emailClick&gt;
&lt;emailClick&gt;
&lt;id&gt;2&lt;/id&gt;
&lt;url&gt;https://www.hello.com&lt;/url&gt;
&lt;created_at&gt;2023-02-14 00:00:10&lt;/created_at&gt;
&lt;/emailClick&gt;
&lt;/result&gt;
&lt;/rsp&gt;

and need the below output

&lt;emailClick&gt;
&lt;id&gt;1&lt;/id&gt;
&lt;url&gt;https://www.google.com&lt;/url&gt;
&lt;email_template_id&gt;12&lt;/email_template_id&gt;
&lt;created_at&gt;2023-02-14 00:00:10&lt;/created_at&gt;
&lt;/emailClick&gt;
&lt;emailClick&gt;
&lt;id&gt;2&lt;/id&gt;
&lt;url&gt;https://www.hello.com&lt;/url&gt;
&lt;email_template_id/&gt;
&lt;created_at&gt;2023-02-14 00:00:10&lt;/created_at&gt;
&lt;/emailClick&gt;

I am using below xslt to achieve this output

&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; encoding=&quot;utf-8&quot; omit-xml-declaration=&quot;yes&quot; indent =&quot;yes&quot;/&gt;
&lt;xsl:strip-space elements=&quot;*&quot;/&gt;
&lt;xsl:template match=&quot;/&quot;&gt;
&lt;xsl:for-each select=&quot;rsp/result/emailClick&quot;&gt;
&lt;emailClick&gt;
&lt;id&gt;&lt;xsl:value-of select=&quot;id&quot; /&gt;&lt;/id&gt;
&lt;url&gt;&lt;xsl:value-of select=&quot;url&quot; /&gt;&lt;/url&gt;
&lt;email_template_id&gt;&lt;xsl:value-of select=&quot;email_template_id&quot;/&gt;&lt;/email_template_id&gt;
&lt;created_at&gt;&lt;xsl:value-of select=&quot;created_at&quot;/&gt;&lt;/created_at&gt;
&lt;/emailClick&gt;
&lt;/xsl:for-each&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;

Is there any better way to achieve this , any guidance would be highly appreciated

答案1

得分: 0

以下样式表避免在xsl:for-each内提及元素名称,并从&lt;so:emailClick&gt;元素中读取必需的元素名称,以通用方式处理它们:

&lt;xsl:stylesheet version=&quot;1.0&quot;
  xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;
  xmlns:so=&quot;https://stackoverflow.com&quot;&gt;
  &lt;xsl:output method=&quot;xml&quot; encoding=&quot;utf-8&quot; omit-xml-declaration=&quot;yes&quot; indent=&quot;yes&quot; /&gt;
  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;
  &lt;so:emailClick&gt;
    &lt;id /&gt;
    &lt;url /&gt;
    &lt;email_template_id /&gt;
    &lt;created_at /&gt;
  &lt;/so:emailClick&gt;
  &lt;xsl:template match=&quot;/&quot;&gt;
    &lt;xsl:for-each select=&quot;rsp/result/emailClick&quot;&gt;
      &lt;xsl:variable name=&quot;this&quot; select=&quot;.&quot; /&gt;
      &lt;xsl:copy&gt;
        &lt;xsl:for-each select=&quot;document(&#39;&#39;)/*/so:*[local-name()=name(current())]/*&quot;&gt;
          &lt;xsl:element name=&quot;{name()}&quot;&gt;
            &lt;xsl:value-of select=&quot;$this/*[name()=name(current())]&quot; /&gt;
          &lt;/xsl:element&gt;
        &lt;/xsl:for-each&gt;
      &lt;/xsl:copy&gt;
    &lt;/xsl:for-each&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;

这是否符合你所说的“通用的方法”?

(XSLT 1.0)

英文:

The following stylesheet avoids any mention of element names inside the xsl:for-each and instead reads the mandatory element names from the &lt;so:emailClick&gt; element and processes them generically:

&lt;xsl:stylesheet version=&quot;1.0&quot;
  xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;
  xmlns:so=&quot;https://stackoverflow.com&quot;&gt;
  &lt;xsl:output method=&quot;xml&quot; encoding=&quot;utf-8&quot; omit-xml-declaration=&quot;yes&quot; indent=&quot;yes&quot; /&gt;
  &lt;xsl:strip-space elements=&quot;*&quot; /&gt;
  &lt;so:emailClick&gt;
    &lt;id /&gt;
    &lt;url /&gt;
    &lt;email_template_id /&gt;
    &lt;created_at /&gt;
  &lt;/so:emailClick&gt;
  &lt;xsl:template match=&quot;/&quot;&gt;
    &lt;xsl:for-each select=&quot;rsp/result/emailClick&quot;&gt;
      &lt;xsl:variable name=&quot;this&quot; select=&quot;.&quot; /&gt;
      &lt;xsl:copy&gt;
        &lt;xsl:for-each select=&quot;document(&#39;&#39;)/*/so:*[local-name()=name(current())]/*&quot;&gt;
          &lt;xsl:element name=&quot;{name()}&quot;&gt;
            &lt;xsl:value-of select=&quot;$this/*[name()=name(current())]&quot; /&gt;
          &lt;/xsl:element&gt;
        &lt;/xsl:for-each&gt;
      &lt;/xsl:copy&gt;
    &lt;/xsl:for-each&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;

Is that what you meant by "a generic way of doing this"?

(XSLT 1.0)

答案2

得分: 0

这是一种推送式编程方法。这意味着它使用apply-templates来推送子节点。它还使用了一个模式(mode)。因此,输出的节点被推送到一个身份模板。

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

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

  <xsl:template match="emailClick">
    <xsl:copy>
      <xsl:apply-templates select="@*" mode="output"/>
      <xsl:choose>
        <xsl:when test="id">
          <xsl:apply-templates select="id" mode="output"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="id"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:choose>
        <xsl:when test="url">
          <xsl:apply-templates select="url" mode="output"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="url"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:choose>
        <xsl:when test="email_template_id">
          <xsl:apply-templates select="email_template_id" mode="output"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="email_template_id"/>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:choose>
        <xsl:when test="created_at">
          <xsl:apply-templates select="created_at" mode="output"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="created_at"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>

  <!-- 身份模板。 -->
  <xsl:template match="node()|@*" mode="output">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" mode="output"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
英文:

This is a push programming approach. Which means it pushes the child nodes using apply-templates. It also uses a mode. So the nodes being output are pushed to an identity template.

&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; encoding=&quot;utf-8&quot; omit-xml-declaration=&quot;yes&quot; indent =&quot;yes&quot;/&gt;
&lt;xsl:strip-space elements=&quot;*&quot;/&gt;
&lt;xsl:template match=&quot;node()&quot;&gt;
&lt;xsl:apply-templates select=&quot;node()&quot;/&gt;
&lt;/xsl:template&gt;
&lt;xsl:template match=&quot;emailClick&quot;&gt;
&lt;xsl:copy&gt;
&lt;xsl:apply-templates select=&quot;@*&quot; mode=&quot;output&quot;/&gt;
&lt;xsl:choose&gt;
&lt;xsl:when test=&quot;id&quot;&gt;
&lt;xsl:apply-templates select=&quot;id&quot; mode=&quot;output&quot;/&gt;
&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;
&lt;xsl:element name=&quot;id&quot;/&gt;
&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;
&lt;xsl:choose&gt;
&lt;xsl:when test=&quot;url&quot;&gt;
&lt;xsl:apply-templates select=&quot;url&quot; mode=&quot;output&quot;/&gt;
&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;
&lt;xsl:element name=&quot;url&quot;/&gt;
&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;
&lt;xsl:choose&gt;
&lt;xsl:when test=&quot;email_template_id&quot;&gt;
&lt;xsl:apply-templates select=&quot;email_template_id&quot; mode=&quot;output&quot;/&gt;
&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;
&lt;xsl:element name=&quot;email_template_id&quot;/&gt;
&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;
&lt;xsl:choose&gt;
&lt;xsl:when test=&quot;created_at&quot;&gt;
&lt;xsl:apply-templates select=&quot;created_at&quot; mode=&quot;output&quot;/&gt;
&lt;/xsl:when&gt;
&lt;xsl:otherwise&gt;
&lt;xsl:element name=&quot;created_at&quot;/&gt;
&lt;/xsl:otherwise&gt;
&lt;/xsl:choose&gt;
&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;
&lt;!-- Identity. --&gt;
&lt;xsl:template match=&quot;node()|@*&quot; mode=&quot;output&quot;&gt;
&lt;xsl:copy&gt;
&lt;xsl:apply-templates select=&quot;node()|@*&quot; mode=&quot;output&quot;/&gt;
&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;

huangapple
  • 本文由 发表于 2023年3月3日 23:54:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/75629260.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定