XSLT是XML的一种转换语言,旨在将结构化文档转换为其他格式(如XML,HTML和纯文本,或者在XSLT 3,JSON中)。问题应该根据需要使用xslt-1.0,xslt-2.0或xslt-3.0标记之一。
XSLT 3.0 将 JSON 处理为 XML:从未调用过数组模板 - 优先级规则不清楚
在 XSLT 3.0 中,我想以标准方式处理通过从包含对象和简单值数组的 JSON 输入调用 json-to-xml() 隐式生成的 XML。解决方案...
我有一个包含锦标赛数据的 XML 文件,想要计算每支球队的总得分。这是 XML: 我有一个包含锦标赛数据的 XML 文件,想要计算每支球队的总得分。这是 XML: <tournoi date="2012-12-12"> <match date="2012-12-20" heure="18:00:00"> <equipe nom="AAAA" score="3" /> <equipe nom="BBBB" score="0" /> </match> <match date="2012-12-20" heure="20:00:00"> <equipe nom="CCCC" score="1" /> <equipe nom="DDDD" score="1" /> </match> <match date="2012-12-21" heure="18:00:00"> <equipe nom="AAAA" score="2" /> <equipe nom="CCCC" score="4" /> </match> <match date="2012-12-21" heure="20:00:00"> <equipe nom="BBBB" score="7" /> <equipe nom="DDDD" score="0" /> </match> <match date="2012-12-22" heure="18:00:00"> <equipe nom="AAAA" score="3" /> <equipe nom="DDDD" score="2" /> </match> <match date="2012-12-22" heure="20:00:00"> <equipe nom="CCCC" score="5" /> <equipe nom="BBBB" score="1" /> </match> </tournoi> 这是我用来计算分数的 XSLT 代码: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="teams" match="equipe" use="@nom"/> <xsl:template match="/"> <html> <body> <h2>Total points of each team</h2> <table border="1" width="100%"> <tr bgcolor="green"> <th>Team</th> <th>Total Points</th> </tr> <!-- Group by unique team names --> <xsl:for-each select="tournoi/match/equipe[not(@nom = preceding::equipe/@nom)]"> <tr> <td><xsl:value-of select="@nom"/></td> <td> <xsl:variable name="teamName" select="@nom"/> <xsl:variable name="totalPoints" as="number"> <xsl:for-each select="key('teams', $teamName)"> <xsl:variable name="opponentScore" select="../equipe[@nom != $teamName]/@score"/> <xsl:choose> <xsl:when test="@score > $opponentScore"><xsl:value-of select="2" as="number"/></xsl:when> <xsl:when test="@score = $opponentScore"><xsl:value-of select="1" as="number"/></xsl:when> <xsl:otherwise><xsl:value-of select="0" as="number"/></xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:variable> <xsl:value-of select="$totalPoints"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 预期输出示例: 装备点数 AAAA 4 但目前,我获得的 AAAA 为 202,而不是 4。 您这里有两个不同的问题: 按团队对结果进行分组; 计算每队的总分。 对于第一个问题,您应该使用 Muenchian 分组 方法(假设您使用的是 XSLT 1.0 处理器)。我看到您确实为此定义了一个合适的密钥,但您没有使用它。 对于第二个问题,可以使用与这里相同的方法。 结合这两种方法,生成的样式表可能如下所示: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="team" match="equipe" use="@nom"/> <xsl:key name="wins" match="equipe[@score > ancestor::match/equipe/@score]" use="@nom"/> <xsl:key name="draws" match="equipe[not(@score != ancestor::match/equipe/@score)]" use="@nom"/> <xsl:template match="/tournoi"> <html> <body> <table border="1"> <tr> <th>Team</th> <th>Total Points</th> </tr> <xsl:for-each select="match/equipe[count(. | key('team', @nom)[1]) = 1]"> <tr> <td> <xsl:value-of select="@nom"/> </td> <td> <xsl:value-of select="2*count(key('wins', @nom)) + count(key('draws', @nom))"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 当应用于(更新的)XML 输入时,结果将呈现为:
在 XSLT 1.0 中使用结构(用于 xPath 翻译)时出现问题
我们公司有一个系统,定期从客户系统获取xml文件。 我们使用 xslt 将数据从客户结构转换为我们数据库支持的 xPath 结构。 95%...
如何使用命名空间前缀进行转换?添加它 do xslt 不起作用
问题来了。 XMLDOM(Microsoft.XMLDOM 对象)不缩进 XML。它是人类无法读取的。 以前,在制作 XML 文档后,我只会运行此转换 问题来了。 XMLDOM(Microsoft.XMLDOM 对象)不缩进 XML。它是人类无法读取的。 以前,在制作 XML 文档后,我只会运行此转换 <?xml version="1.0" encoding="UTF-8"?> <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="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 在某处找到的。 然后我将使用原始 XML 对象 oXDoc,使用此 XSLT 转换创建此 XML 对象 oXsl 指令,然后调用transformNodeToObject,并创建一个第三个对象oRes,它将是一个已经缩进的XML,然后将该第三个对象保存到磁盘或其他地方。 oXDoc.transformNodeToObject(oXsl, oRes) oRes.Save(cXmlFile) 它工作得很好,直到出现具有非默认名称空间的文档。 例如,像这样的 XML <?xml version="1.0" encoding="UTF-8"?> <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"> <cbc:IssueDate>2024-11-07</cbc:IssueDate> <cac:AccountingSupplierParty> <cac:Party> <cbc:EndpointID schemeID="1234">AB90000012345</cbc:EndpointID> </cac:Party></cac:AccountingSupplierParty></Invoice> 不再有效,但我在 XSL 中包含了所有名称空间,当我寻找答案时,所有名称似乎都在说同样的事情。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"> <xsl:output method='xml' version='1.0' encoding='UTF-8' indent='yes'/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 如果我删除原始 XML 文档中的所有前缀,它会起作用,它会缩进并包含所有名称空间绑定,但它没有用!我需要提供所有前缀,因为它们之间有很多通用名称,例如名称或 ID 等,否则它们会变得不明确。 那么正确的做法是什么呢?如何使其缩进文档并保留所有前缀而不出错?我按原样复制文档,仅添加缩进。无需实际转换。 我试过这个: <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> <xsl:template match="@*|*:node()"> <xsl:copy> <xsl:apply-templates select="@*|*:node()"/> </xsl:copy> 和 这个 <xsl:template match="@*|:node()"> <xsl:copy> <xsl:apply-templates select="@*|:node()"/> </xsl:copy> 甚至这个 <xsl:template match="@*|:node()"> <xsl:copy> <xsl:apply-templates select="@*|node()|cbc:node()|cac:node()"/> </xsl:copy> 还有很多很多其他的。 原始代码会出现错误,仅显示“msxml3:只有默认命名空间可以有空 URI”之类的内容。这真的很奇怪。所有命名空间都写在两个文档中,那么是什么给出了??? 其他尝试只是不喜欢该模式,并且错误显示“无效匹配模式”、“找到:”、“预期 eof”等等。 我也尝试过包括 extension-element-prefixes="cbc cac #default" 进入 xsl:stylesheet 元素,结果为零。 更新: 好吧,如果我在转换之前将 xml 保存到磁盘,然后再次将其加载到同一个对象中并进行转换,那么这最终可以工作。 也许元素的创建方式有问题?我只是将前缀和名称放在一起,如下所示: oEl = oMainEl.appendChild(oXDoc.createElement("cac:Party")).appendChild(oXDoc.createElement("cbc:EndpointID")) oEl.Text = "AB90000012345" oEl.setAttribute("schemeID", "1234") 很奇怪。也许需要进行一些奇怪的操作 如果我没记错的话,使用 MSXML,要在某个命名空间中正确创建一般元素或节点,不要使用 createElement,使用专有的 createNode https://learn.microsoft.com/en -us/previous-versions/windows/desktop/ms757901(v=vs.85) 确保传入节点类型、限定名称和要创建的节点的命名空间 URI。 参见https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms757047(v=vs.85)中关于createElement的备注: 使用该方法创建元素与使用createNode是一样的 其中类型参数值为 NODE_ELEMENT 并且没有命名空间 指定。 您不能使用以下方法创建命名空间限定的元素 创建元素方法。无论命名空间前缀是否为 包含在 tagName 参数*,* 的 namespaceURI 属性中 新元素节点设置为空字符串“”。一个元素节点 作为 XML 文档加载操作的一部分构造的永远不会有 前缀和空命名空间统一资源标识符 (统一资源定位符)。您只能使用以下命令创建命名空间限定的元素 DOMDocument 对象的 createNode 方法。
我正在使用 DITA-OT 将 .dita 转换为 .pdf。我不明白如何更改标题的大小?
下午好!我正在使用 Oxygen XML Author 26.1 来开发 DITA 文档映射。然后我使用 DITA Open Toolkit 4.2.3(预安装的 org.dita.pdf2 插件)将 file.dita 转换为文件 .pdf。我...
使用 XSLT 将 JSON 转换为 XML(基本问题/13007280)
我管理包含书名、作者和语言的书籍列表。有时一个盒子(“coffret”)包含许多书。 我尝试了 questions/13007280 中的 XSLT 代码:它工作得很好,但仅适用于...
为什么我的 XSLT `xsl:attribute` 在放置在 `xsl:element` 中的 `xsl:text` 之后时消失了?
我正在进行 XSLT 转换以创建具有 onclick 属性的 HTML 元素。当我在按钮的文本内容之前定义 onclick 属性时,一切都按如下方式工作 我正在进行 XSLT 转换,以创建具有 <button> 属性的 HTML onclick 元素。当我定义 onclick 属性 before 按钮的文本内容时,一切都会按预期工作。这是有效的代码: <xsl:element name="button"> <xsl:attribute name="onclick"> console.log(600); </xsl:attribute> <xsl:text>Click Me</xsl:text> </xsl:element> 输出: <button onclick="console.log(600);">Click Me</button> 但是,如果我将 xsl:attribute 放在 xsl:text 内容之后,如下所示: <xsl:element name="button"> <xsl:text>Click Me</xsl:text> <xsl:attribute name="onclick"> console.log(600); </xsl:attribute> </xsl:element> 该属性被忽略,输出仅包含文本: <button>Click Me</button> 为什么将xsl:attribute放在xsl:text之后会导致属性消失? XSLT 中是否有一条规则要求在内容之前定义属性?如果是,其背后的原因是什么?为什么它会这样? 规则位于 https://www.w3.org/TR/xslt-10/#creating-attributes: 以下均为错误: 在添加子元素后向元素添加属性 它;实现可能会发出错误信号或忽略 属性。 所以,是的,您需要在任何子节点(如文本节点)之前输出属性,否则您可能会收到错误或 XSLT 处理器会忽略该属性。
希望使用来自 Saxon 的 Java 或 .NET 调用从 XSLT 执行 HTTP POST
我使用一种专有工具,通过 Saxon 10 引擎利用 XSLT。 我正在寻找一种将有效负载从 XSL 发送到 API 端点的方法。对于 GET 来说,有效负载太大(这......
XSLTProcessor::transformToUri():内存分配失败:达到任意 MAX_URI_LENGTH 限制
我有一些 XML 文件需要在 Html 中“转换”并显示在屏幕上。 我使用 DOMDocument 和 XSLTProcessor 开发了一个几乎在任何时候都可以工作的简单脚本。 亲...
对 XSLT 格式相当陌生,并尝试让它根据 1 个输入输出 2 个数字。 我尝试了一些方法但没有成功。 假设它从已链接的 TelephoneNumber 获取 8989...
我不明白应用模板在 XSLT 中是如何工作的。 现在我有这个 XML 文档: 我不明白应用模板在 XSLT 中是如何工作的。 现在我有了这个 XML 文档: <?xml version="1.0" encoding="UTF-8"?> <people> <person> <name>John Doe</name> <age>30</age> <occupation>Software Engineer</occupation> </person> <person> <name>Jane Smith</name> <age>28</age> <occupation>Graphic Designer</occupation> </person> <person> <name>Sam Brown</name> <age>35</age> <occupation>Data Analyst</occupation> </person> </people> 还有这个 XSLT: <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <!-- Output --> <xsl:output method="html" /> <!-- Default template --> <xsl:template match="/"> <html> <body> <xsl:apply-templates /> </body> </html> </xsl:template> <!-- Adding ages --> <xsl:template match="person"> <p> <xsl:value-of select="./name/text()" /> </p> </xsl:template> <!-- Adding names --> <xsl:template match="age"> <p> <xsl:value-of select="./text()" /> </p> </xsl:template> </xsl:stylesheet> 当我运行它时,我得到的结果是这样的: <html> <body> <p>John Doe</p> <p>Jane Smith</p> <p>Sam nkmk</p> </body> </html> 这是出乎意料的,因为我想要人们的姓名和年龄,因为我定义了这两个模板。 在 this 问题的答案之一中,如下所述 XSLT 默认模板规则的定义方式是,默认情况下,它们将匹配文档的顶部节点,然后递归处理每个子节点节点,一直到底部,很公平,所以从技术上讲,人们会期望处理person节点,然后是子节点,并且由于有年龄模板,因此应该将年龄添加到html中,但事实并非如此。 (另外,根据this问题的第一个答案,它甚至应该打印姓名和职业,因为我没有定义与文本匹配的模板,就像这样)。 鉴于我是 XSLT 新手,所有这些都让我感到非常困惑。 你能向我解释一下这是怎么回事吗? 您遗漏了报价的重要部分,即“默认情况下”。 您的模板匹配person会覆盖默认的内置模板 - 并且它不会将模板应用于age(或任何其他)子级person。因此,匹配 age 的模板永远不会被实例化,否则会处理 person 的其他子级的内置模板也不会被实例化。
请帮助使用基本的 XSLT 模板来为每个项目创建列。 输入 XML: 约翰 约翰图片 请帮助使用基本的 XSLT 模板来为每个项目创建列。 输入 XML: <list> <item> <name>John</name> <image>John Picture</image> </item> <item> <name>Bob</name> <image>Bob Picture</image> </item> </list> 输出 HTML: <table> <tr> <td>John</td> <td>Bob</td> </tr> <tr> <td>John Picutre</td> <td>Bob Picture</td> </tr> </table> 如果您希望每个 item 元素都有一列,那么您应该首先选择仅第一个 item 元素下的元素,因为这些元素将代表每行的开始 <xsl:for-each select="item[1]/*"> 然后,要构建行,请获取所有与当前所选元素同名的 item 元素下的相关元素 <xsl:apply-templates select="../../item/*[name() = name(current())]" /> 虽然如果你像这样定义一个键可能会更容易...... <xsl:key name="items" match="item/*" use="name()" /> 然后你会得到具有相同名称的元素,如下所示: <xsl:apply-templates select="key('items', name())" /> 尝试这个 XSLT <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" indent="yes"/> <xsl:key name="items" match="item/*" use="name()" /> <xsl:template match="list"> <table> <xsl:for-each select="item[1]/*"> <tr> <xsl:apply-templates select="key('items', name())" /> </tr> </xsl:for-each> </table> </xsl:template> <xsl:template match="item/*"> <td> <xsl:value-of select="." /> </td> </xsl:template> </xsl:stylesheet> 这假设所有元素都存在于每个 item 下(好吧,至少在第一个 item 下)。 您需要发布您编写的XSLT以获得结果,下面是您可以使用的代码: 最终更新脚本: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="1.0"> <xsl:output indent="yes"/> <xsl:template match="list"> <table> <tr> <xsl:for-each select="item/name"> <td> <xsl:value-of select="."/> </td> </xsl:for-each> </tr> <tr> <xsl:for-each select="item/image"> <td> <xsl:value-of select="."/> </td> </xsl:for-each> </tr> </table> </xsl:template> </xsl:stylesheet>
我被要求查看一些旧的 XSL-FO 样式表并将它们转换为 XSLT (HTML),以便我可以获得 HTML 输出。 我能找到的唯一工具是 RenderX XSLFOToHTML 中的工具,但我不知道...
我正在尝试使用 XSL 根据其内部列表的排序对列表进行排序。 我有以下 XML 我正在尝试使用 XSL 根据其内部列表的排序对列表进行排序。 我有以下 XML <Shirt> <Material Name="Fleece"> <Color Name="Green"> <Details> <!--Omitted--> </Details> </Color> <Color Name="Blue"> <Details> <!--Omitted--> </Details> </Color> </Material> <Material Name="Cotton"> <Color Name="Red"> <Details> <!--Omitted--> </Details> </Color> <Color Name="Acolor"> <Details> <!--Omitted--> </Details> </Color> </Material> </Shirt> 我有以下 XSL <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <!-Sort this first--> <xsl:template match="Shirt/Material"> <xsl:copy> <xsl:apply-templates select="Color|@*"> <xsl:sort select="@Name" order="ascending" /> </xsl:apply-templates> </xsl:copy> </xsl:template> <!-Sort this second--> <xsl:template match="Shirt"> <xsl:copy> <xsl:apply-templates select="Material|@*"> <xsl:sort select="Color/@Name" order="ascending" /> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:transform> 我获得以下输出 <Shirt> <Material Name="Fleece"> <Color Name="Blue"> <Details> <!--Omitted--> </Details> </Color> <Color Name="Green"> <Details> <!--Omitted--> </Details> </Color> </Material> <Material Name="Cotton"> <Color Name="Acolor"> <Details> <!--Omitted--> </Details> </Color> <Color Name="Red"> <Details> <!--Omitted--> </Details> </Color> </Material> </Shirt> 我的目标是让材质“Cotton”成为列表中的第一个,因为按字母顺序排序时它的颜色为“AColor”。据我了解,转换会以不明确的顺序投影到输出树。但是,是否可以在 XSL 中“顺序”执行排序转换?首先对颜色列表进行排序,然后对材质列表进行排序? 另外,不幸的是我只能使用 XSLT 1.0 首先对颜色列表进行排序,然后根据材质列表进行排序? 试试这个方法: XSLT 1.0 + EXSLT 节点集() 函数 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="Shirt"> <xsl:copy> <!-- pre-sort --> <xsl:variable name="pre-sort"> <xsl:apply-templates select="Material" mode="first-pass"/> </xsl:variable> <!-- output --> <xsl:apply-templates select="exsl:node-set($pre-sort)/Material"> <xsl:sort select="Color[1]/@Name"/> </xsl:apply-templates> </xsl:copy> </xsl:template> <xsl:template match="Material" mode="first-pass"> <xsl:copy> <xsl:copy-of select="@*"/> <xsl:apply-templates select="Color"> <xsl:sort select="@Name" /> </xsl:apply-templates> </xsl:copy> </xsl:template> </xsl:stylesheet>
我正在尝试修改代码,以便仅从时间戳(秒)中删除最后一个 :00,而不是时间为例如 15:00:00 时的分钟 我目前有 我正在尝试修改代码,以便仅从时间戳(秒)中删除最后一个 :00,而不是在时间为例如 15:00:00 时删除分钟 我目前有 处理以下格式的时间/日期...2024-10-17 15:00:00 我确信使用 Last 或 tokenize 是很简单的事情,但我对此很陌生,并且以其他人的代码为起点。 目前给出的结果只是 15,而不是我需要的 1500。 提前致谢 你的问题不完全清楚。 如果您总是想从 $date-time 变量中删除 seconds 部分,您可以简单地执行以下操作: <xsl:value-of select="substring($date-time, 1, 16)"/> 如果您只想在秒部分为00时执行此操作,您可以这样做: <xsl:value-of select="replace($date-time, ':00$', '')"/>
如何通过安全性阻止xslt中的权限:hasPermission
在下面的代码中,需要限制所有用户的权限。 即 security:hasPermission 我们需要限制。 ...
我正在 QBO3 系统中开发自定义表单,并将调用一些 Javascript 将表单中的数据作为一行保存到付款表中。 当我这样做时,有两个字段需要 Pe...
我正在使用 .xsl 文件将 FileMaker Pro 导出的 XML 文件转换为另一个格式化为 PBCore 2.0 架构的 XML 文件。我的组织需要能够打开输出 XML...