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

原始嵌套级别的XSLT转换

公良子轩
2023-03-14

我对这个问题进行了编辑以使其清楚。我想获取所有的节节点,包括它们的节节点和标题节点,保持嵌套级别。下面是我想要的输出结果:

<?xml version="1.0" encoding="UTF-8"?>
<results>
    <section id="intro" difficulty="easy">
        <title>Introduction</title>
        <section>
            <title>Web Data and the Two Cultures</title>
        </section>
    </section>
    <section id="syntax" difficulty="medium">
        <title>A Syntax For Data</title>
        <section>
            <title>Base Types</title>
        </section>
        <section>
            <title>Representing Relational Databases</title>
        </section>
        <section>
            <title>Representing Object Databases</title>
        </section>
    </section>
</results>

xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<book>
    <title>Data on the Web</title>
    <author>Serge Abiteboul</author>
    <author>Peter Buneman</author>
    <author>Dan Suciu</author>
    <section id="intro" difficulty="easy">
        <title>Introduction</title>
        <p>Text ... </p>
        <section>
            <title>Web Data and the Two Cultures</title>
            <p>Text ... </p>
            <figure height="400" width="400">
                <title>Traditional client/server architecture</title>
                <image source="csarch.gif"/>
            </figure>
            <p>Text ... </p>
        </section>
    </section>
    <section id="syntax" difficulty="medium">
        <title>A Syntax For Data</title>
        <p>Text ... </p>
        <figure height="200" width="500">
            <title>Graph representations of structures</title>
            <image source="graphs.gif"/>
        </figure>
        <p>Text ... </p>
        <section>
            <title>Base Types</title>
            <p>Text ... </p>
        </section>
        <section>
            <title>Representing Relational Databases</title>
            <p>Text ... </p>
            <figure height="250" width="400">
                <title>Examples of Relations</title>
                <image source="relations.gif"/>
            </figure>
        </section>
        <section>
            <title>Representing Object Databases</title>
            <p>Text ... </p>
        </section>
    </section>
</book>

以下是我的解决方案,这是错误的:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/book">
    <xsl:apply-templates select="section"/>
</xsl:template>
<xsl:template match="section">
    <xsl:element name="section">
        <xsl:for-each select="@*">
            <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
        </xsl:for-each>
    </xsl:element>
    <xsl:apply-templates select="title"/>
    <xsl:apply-templates select="section"/>
</xsl:template>
<xsl:template match="title">
    <xsl:element name="title">
        <xsl:for-each select="@*">
            <xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
        </xsl:for-each>
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

我曾想过使用递归,但我没有发现如何在XSLT中做到这一点。应该还有其他方法。提前感谢!

共有1个答案

怀展
2023-03-14

如果您确实想做的只是将book元素重命名为结果,您需要从XSLT标识模板开始

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

就其本身而言,它按原样复制源文档中的所有节点,这意味着您只需要为您希望更改的节点编写一个模板。在这种情况下,您正在更改book元素,因此您将拥有一个特定的模板,如下所示:

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

此外,如果您想删除除章节和标题(以及书籍)之外的元素,一种方法是使用模板匹配“其他”元素,然后忽略它们

<xsl:template match="*[not(self::book) and not(self::section) and not(self::title)]" />

就这样!试试这个XSLT

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

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

  <xsl:template match="*[not(self::book) and not(self::section) and not(self::title)]" />

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

但是请记住,如果您使用的是<代码>

 类似资料:
  • 我正在尝试映射我的遗留API对象(我无法更改它),该对象具有嵌套的原始类型属性。列表的元素与DTO列表的元素不兼容,应显式映射为嵌套。不幸的是,MapStruct似乎认为原始与所有类型化列表兼容,并忽略了我试图指定的任何映射,而生成的代码不能正常工作,随后在序列化程序的某个地方产生错误。 我的API对象具有嵌套的原始类型列表: 我的DTO对象具有DTO值类型元素的泛型类型列表: ...但MapSt

  • 问题内容: 如果嵌套太深,看起来Powershell在导出为JSON时会切断数据。我的对象层次结构如下所示: 由于某种原因,当我转换为JSON时,powershell会将第三级(这些源使用的数据的集合)导出为空字符串,即使它是添加了各种NoteProperty的对象数组。例如: 这将导致以下JSON字符串: 转换为XML会导致类似情况: 在Powershell中是否存在某种对象嵌套限制? 问题答案

  • 如果简化,将得到以下JSON实现: 数据(实体)- 我假设我将首先解密数据对象,从中获取一个类型,然后从该类型使用字符串“Data”中的必要类型进行解密,但我的想法失败了。有没有办法解决这个问题? 我创造了这种类型的正常实体 在“数据”字段中,我放置一个对象,该对象也由 当试图用 我犯了个错误 com.fasterxml.jackson.databind.exc.不匹配的输入异常:无法构造实例(尽

  • 我想从XML结构中使用单个节点创建嵌套的XML节点,我尝试过但无法带来嵌套的XML结构,请一些人帮助我,我无法获得预期的行为。 XML结构: XSL使用: 收到的输出: 预期产出 “人员非活动”元素应用于匹配

  • 我想使用XSLT展平XML文件。示例(可以有任意数量的和节点): 输入: 期望输出: 如何仅展平那些将属性设置为的标记?

  • 使用Laravel 5.6,我试图从MySQL类别表中显示子类别的子类别。我想传递这个名字,并获得它的所有子类,而不管父类是什么。 类别表 期望结果 return App\Category::where('name','Child-1-P-2'))-