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

XSLT-对节点进行分组时缺少属性

葛驰
2023-03-14

以下是XML输入、想要的输出、我拥有的代码和我得到的错误结果的最小但完整的示例。

这是我的输入XML

<?xml version="1.0"?>
<R>
  <M>
    <H>1</H>
    <B>
        <p Ccy="GBP">1</p>
    </B>
  </M>
  <M>
    <H>1</H>
    <B>
        <p Ccy="GBP">2</p>
    </B>
  </M>
  <M>
    <H>1</H>
     <B>
        <p Ccy="GBP">3</p>
    </B>
  </M>
  <M>
    <H>1</H>
    <B>
        <p Ccy="GBP">4</p>
    </B>
  </M>
</R>

这是我当前的XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">

    <xsl:output indent="yes" />

     <xsl:template match="/*">
        <R>
            <M>
                <xsl:apply-templates select="M[1]/H | M/B" />
            </M>
        </R>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

这是我目前的输出

如果您查看输出,输出中缺少Ccy="GBP"。请查看预期输出。

<?xml version="1.0" encoding="UTF-8"?>
<R xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
   <M>
      <H>1</H>
      <B>
        <p>1</p>
      </B>
      <B>
        <p>2</p>
      </B>
      <B>
        <p>3</p>
      </B>
      <B>
        <p>4</p>
      </B>
   </M>
</R>

预期产出

<?xml version="1.0" encoding="UTF-8"?>
<R xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">
   <M>
      <H>1</H>
      <B>
        <p Ccy="GBP">1</p>
      </B>
      <B>
        <p Ccy="GBP">2</p>
      </B>
      <B>
        <p Ccy="GBP">3</p>
      </B>
      <B>
        <p Ccy="GBP">4</p>
      </B>
   </M>
</R>

小提琴:https://xsltfiddle.liberty-development.net/ej9EGbG/31

共有2个答案

章茂
2023-03-14
     <xsl:template match="/*">
        <R>
            <M>
                <xsl:apply-templates select="M[1]/H | M/B" />
            </M>
        </R>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:if test="@Ccy">
                <xsl:attribute name="Ccy">
                    <xsl:value-of select="@Ccy"/>
                </xsl:attribute>
            </xsl:if>

            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
Simply add attribute @Ccy.
计均
2023-03-14

如果您想复制所有属性,只需扩展应用程序模板来处理它们并设置一个复制它们的模板:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">

    <xsl:output indent="yes" />

     <xsl:template match="/*">
        <R>
            <M>
                <xsl:apply-templates select="M[1]/H | M/B" />
            </M>
        </R>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="@*">
        <xsl:copy/>
    </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/ej9EGbG/34

 类似资料:
  • 我有一个neo4j数据库,里面有一些数据。大多数节点都有一个属性,但不是所有节点都有;我想构造一个Cypher查询来匹配并返回所有不匹配的查询。 我已经尝试了以下所有方法,但它们都给出了0个结果: 但是,我至少有一个节点没有指定属性,我可以通过 检查结果视图中的节点,或者注意到 返回。 如何匹配没有属性的所有节点?

  • 我有一个修改密码查询的性能问题。给定是一个源节点,它与子节点有大量的传出关系。这些子节点都有一个键属性。现在的目标是在原点和子节点之间创建新节点,以便将共享相同密钥属性值的所有子节点分组。这个想法的情节可以在neo4j控制台上找到:http://console.neo4j.org/?id=vinntj 我将查询与sping-data-neo4j 2.2.2一起使用。RELEASE和neo4j 1.

  • 我有一个XML: 我想向根元素:/doc添加一个属性(名称空间),以便输出如下所示: 我尝试了三种xslt(跳过了默认的“复制所有”部分以减少问题的长度)。 xslt1:见下文,问题在于将空名称空间xmlns=”“添加到/doc的所有子节点(即:/doc/tag1和/doc/tag2) Xslt2:见下文,问题是“ns”被添加到根节点:和 xslt3:请参见下文,问题是报告了错误:未定义名称空间前

  • 我想递归地连接一个节点的参数值和它的父节点的相同参数值。 例如,如下: 应该成为 我试过了 有什么问题吗?

  • 我有一个maven项目,我想导出到runnable中。jar文件。 在VSCode中,项目可以正常工作。导出的项目包括。jar文件和包含所有javaFX文件的libs文件夹: 运行以下命令时出现问题: 我不明白为什么会出现这个错误,因为所有JavaFX文件都位于libs文件夹中并且可见。 我目前使用SDKman的Java Temurin 18.0.1。 <代码>Pom。xml文件: 我尝试下载Ja

  • 我第一次尝试使用JavaFX。我在IntelliJ中创建了一个*.fxml文件的项目。然后,我在IntelliJ中打开了内置的fxml gui编辑器。我得到一个警告,我需要为JavaFX添加一个SDK。我转到了项目结构设置、模块、依赖项,并添加了“IntelliJ dir\jre64\lib\ext\jfxrt.jar”。警告消失了。模块作用域设置为编译。如果我试图通过单击IntelliJ中类声明