当前位置: 首页 > 知识库问答 >
问题:

将XML节点合并为一个逗号分隔的节点

松茂实
2023-03-14

我有一个XML结构,我想用XSLT转换它。然而,使其尽可能动态化是很重要的。我相信制作一个feed的副本是可能的,然后只需选择一个特定的部分并对其进行转换。当一个新节点添加到原始XML中时,不需要在XSLT中进行任何更改,就可以将这个新节点包含在XSLT的输出中。

原始XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<catalog week_id="629" generated_at="15.11.2017 23:53" version="2">
  <item>
    <lot>
      <id>2982641</id>
      <title_local><![CDATA[Title]]></title_local>
      <sub_title_local>Subtitle</sub_title_local>
      <promo>false</promo>
    </lot>
    <lot_specifics>
      <case_material>
        <name_local>Materiaal kast</name_local>
        <name_en>Case material</name_en>
        <slug>s-10-materiaal-kast</slug>
        <option>
          <value_local>Verguld</value_local>
          <value_en>Gold-plated</value_en>
          <slug_value>1750-verguld</slug_value>
        </option>
        <option>
          <value_local>Zilver</value_local>
          <value_en>Silver</value_en>
          <slug_value>1751-silver</slug_value>
        </option>
      </case_material>
    </lot_specifics>
    <associations>
      <category_id>1</category_id>
      <auction_id>2</auction_id>
    </associations>
  </item>
</catalog>
<?xml version="1.0" encoding="UTF-8"?>
<catalog week_id="629" generated_at="15.11.2017 23:53" version="2">
  <item>
    <lot>
      <id>2982641</id>
      <title_local><![CDATA[Title]]></title_local>
      <sub_title_local>Subtitle</sub_title_local>
      <promo>false</promo>
    </lot>
    <lot_specifics>
      <case_material>
        <name_local>Materiaal kast</name_local>
        <name_en>Case material</name_en>
        <slug>s-10-materiaal-kast</slug>
        <value_local>Verguld,Silver</value_local>
        <value_en>Gold-plated,Silver</value_en>
      </case_material>
    </lot_specifics>
    <associations>
      <category_id>1</category_id>
      <auction_id>2</auction_id>
    </associations>
  </item>
</catalog>

共有1个答案

赵智
2023-03-14

由于您没有指定XSLT版本,所以我使用了功能更强大、更适合这样的任务的2.0。

脚本应包含:

  • 标识模板。
  • case_material元素的模板。
    null
    null
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>

  <xsl:template match="case_material">
    <xsl:copy>
      <xsl:apply-templates select="*[name() != 'option']|@*"/>
      <xsl:for-each-group select="option/*" group-by="name()">
        <xsl:if test="current-grouping-key() != 'slug_value'">
         <xsl:element name="{current-grouping-key()}">
           <xsl:value-of select="current-group()" separator=","/>
         </xsl:element>
        </xsl:if>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>

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

在XSLT1.0中编写这样的脚本是可能的,但是您必须编写更多的代码,因为版本1.0不支持分组。

 类似资料:
  • 不具有任何3个属性值(TargetInteresting1、TargetInteresting2、TargetInteresting3)的节点应不加修改地复制到最终结果中。 我正在寻找一个使用XSLT2.0的解决方案。我不知道从何说起,我还不太习惯xslt:-(

  • 我试图将一些JSON对象映射到java对象,然后将这些对象保存到我的neo4j DB中。 我想知道是否有使用neo4j-ogm的解决方案,或者我需要添加Spring Data Neo4J(SDN)来解决这个问题?

  • 作为前言,我意识到还有其他关于逗号分隔数字的正则表达式的主题,但当我试图使用这些解决方案时,它们都不起作用。

  • 假设我们有一个具有10个GPU和40个CPU核的单个节点。这是否可以用来将节点拆分成10个节点,每个节点有4个核心,每个GPU,并带有显式的CPU/GPU绑定?如果是,配置需要是什么样子的?

  • 问题内容: 我有一个简单的查询: 结果如下: 我想在一行中返回结果,所以像这样: 当然,我可以编写一个PL / SQL函数来完成这项工作(我已经在Oracle10g中做到了),但是对于此任务是否有更好的,最好是非Oracle特定的解决方案(或者可能是内置函数) ? 我通常会用它来避免子查询中出现多行,因此,如果一个人有一个以上的公民身份,我不希望他/他在列表中重复。 更新 :我的函数看起来像这样:

  • 问题内容: 例如 根= NodeToInsert可能是 输出应为: 问题答案: 如果事实证明我只是为您做功课,我会感到非常恼火。 结果将是: