xslt 相关问题

XSLT是XML的一种转换语言,旨在将结构化文档转换为其他格式(如XML,HTML和纯文本,或者在XSLT 3,JSON中)。问题应该根据需要使用xslt-1.0,xslt-2.0或xslt-3.0标记之一。


TransformerFactory.newInstance(...) 容易受到 XML 和 XSLT 外部实体攻击

我正在运行 Java 8,SonarQube 告诉我使用 TransformerFactory.new Instance() 容易受到外部 XML 和 XSLT 攻击。 我正在尝试插入 ACCESS_EXTERNAL_DTD 和

回答 1 投票 0

合并 xml - 将元素名称从文档 b 引入文档 a 作为属性值,匹配子文本(或位置?)

👋您好,提前感谢您的任何建议! XMLA 元数据导出 元素名称是自定义的,反映本地字段名称 元素子文本在内容、文档顺序上与 B 相同 👋您好,提前感谢您的任何建议! XML A 元数据导出a 元素名称是自定义的,反映本地字段名称 元素子文本在内容、文档顺序上与 B 相同 <metadata> <record> <Title>Untitled</Title> <Photographer>Gordon Parks</Photographer> <Notes>An important photograph because (...)</Notes> </record> ... </metadata> XML B 元数据导出b 元素名称反映了到都柏林核心元素/术语的配置映射 元素子文本在内容、文档顺序上与 A 相同 <metadata> <record> <title>Untitled</title> <creator>Gordon Parks</creator> <description>An important photograph because (...)</description> </record> ... </metadata> 所需输出 使用本地字段名称作为元素名称 将 DC 元素/项捕获为 @dc 值 <metadata> <record> <Title dc="title">Untitled</Title> <Photographer dc="creator">Gordon Parks</Photographer> <Notes dc="description">An important photograph because (...)</Notes> </record> ... </metadata> 目前的样式表 <xsl:template match="/"> <metadata> <xsl:for-each select="XML_A/metadata/record"> <record> <xsl:for-each select="node()"> <xsl:choose> <xsl:when test="name() != ''"> <!-- minor issue above: without this I believe I was selecting whitespace and/or other nodes... ...ERROR description: "Supplied element name is a zero-length string" --> <xsl:element name="{name()}"> <!-- ACK --> <xsl:value-of select="."/> </xsl:element> </xsl:when> <xsl:otherwise/> </xsl:choose> </xsl:for-each> </record> </xsl:for-each> </metadata> </xsl:template> 关于<!-- ACK --> 正如我上面所说,我相信 A 和 B 中具有相同子文本的序列节点是相同的。因此,对于 A 中每条记录的每个子节点,我认为我可以使用 either position() 或 text() 匹配B中对应的节点。但是... 我尝试实现一个键来匹配 A 和 B 之间所需的元数据/记录(给定的 ID 元素值,未在 XML A 和 B 的示例中显示,可用于匹配记录)。 <xsl:key name="match_xml_b" match="record" use="b_id"> ... <xsl:attribute name="dc" select="key('match_xml_b', a_id, document('XMLB.xml')/[text() = $a_text]/name()/> ...or... <xsl:attribute name="dc" select="key('match_xml_b', a_id, document('XMLB.xml')/[position() = $a_position]/name()/> 我认为我的语法对于选择 record 的子节点不正确,其中文本内容与 A 中当前节点的文本内容匹配(或者位置与 A 中当前节点的位置匹配)。此外,我不确定使用什么 XPath 语法来选择 B 中的元素名称,这正是我的所需输出中需要的。 我也尝试过一些没有钥匙的笨拙匹配,类似于...... <xsl:attribute name="dc" select="document('XMLB.xml')/metadata/record[b_id = a_id]/[position() = $a_position] (: how to use name() here? :)"/> or... <xsl:attribute name="dc" select="document('XMLB.xml')/metadata/record[b_id = a_id]/[text() = $a_text] (: how to use name() here? :)"/> ...不成功。 我这里的困难包括使用 record 或 position() 匹配 text() 的子元素的语法,以及检索匹配后的元素的 name。 如果允许通过匹配文本来链接元素,您可以执行类似以下操作: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:param name="xmlB" select="document('XMLB.xml')"/> <xsl:key name="keyB" match="*" use="text()" /> <xsl:template match="/metadata"> <metadata> <xsl:for-each select="record"> <record> <xsl:for-each select="*"> <xsl:copy> <xsl:attribute name="dc" select="key('keyB', text(), $xmlB)/name()"/> <xsl:apply-templates/> </xsl:copy> </xsl:for-each> </record> </xsl:for-each> </metadata> </xsl:template> </xsl:stylesheet> 这需要 XSLT 2.0 或更高版本。

回答 1 投票 0

如何展开和包围两个其他元素之间的元素

我目前正在将 MS Access 查询传输到 XML,然后使用 XSLT 3.0 将 XML 输入到 FrameMaker 中以用于发布目的。在这个过程中,我必须解析各种Access RTF文件...

回答 1 投票 0

如何在 XSLT 中设置 <xsl:message> 的调试级别

我正在使用 Apache FOP 生成 AFP 和 PDF。理想情况下,将创建大量 AFP 和 PDF。 我在代码的多个位置使用 xsl:message 。 我只想优先考虑一组...

回答 1 投票 0

使用 XSLT 样式表解析 XML 时遇到问题

我在将 Salesforce Marketing Cloud API 返回的 XML 导入 FileMaker 数据库时遇到问题。我已经用其他 XML 集完成了此操作,没有任何问题,但此 XML 与我的不同......

回答 1 投票 0

将具有 rowspan 和 colspan 的 XHTML 表格转换为 LaTeX

我一直在寻找将 HTML 表格转换为 LaTeX 的合适解决方案。我发现以下问题与我的要求相似: XML 表到 LaTeX 将 XHTML 转换为...

回答 1 投票 0

为什么我使用 PHP / Xampp / Laravel / Windows 时收到错误“找不到类“XSLTProcessor””

我正在尝试在 PHP 中实现一些使用 XSLTProcessor 类的代码。 我有一个本地项目,在 Windows 上的 Xampp 上运行并使用 Laravel。 该行: $proc = 新的 XSLTProcessor; 是

回答 2 投票 0

XSLT 选择解码值

下面是我的 XML 示例。看起来这些值已被编码。 我正在创建示例 xslt 模板,如下所示 我如何解码值,使其成为

回答 2 投票 0

XSLT 在 HTML 中嵌入 json

我必须将输入作为 JSON 网页并使用 XSLT 将其嵌入到 HTML 中。 输入 JSON 来自此网页 我想将“坐标”数组的内容嵌入到 H 内的脚本标记中...

回答 1 投票 0

WiX 工具集:.xslt 过滤器未返回所需的输出

我正在尝试在 WiX 4.0 中使用 heat.exe 收获文件时应用 .xslt 过滤器。例如,我想从结果中排除所有 .pdb 文件。但过滤器后的输出与输入 .wxs 文件相同。它...

回答 1 投票 0

XSLT 1.0 模板如何在逻辑后检索第二次出现的值以完全跳过第二次出现

我有以下 XML: 高清 2024 90655 667 我有以下 XML: <DocumentElement> <Sheet1> <FIELD_1>HD</FIELD_1> <FIELD_2>2024</FIELD_2> <FIELD_3>90655</FIELD_3> <FIELD_13>667</FIELD_13> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_2>496</FIELD_2> <FIELD_13>0339618701316335</FIELD_13> <FIELD_22>DMax</FIELD_22> <FIELD_30>8.41</FIELD_30> <FIELD_65>0.16</FIELD_65> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_2>496</FIELD_2> <FIELD_13>0339618701316335</FIELD_13> <FIELD_22>Sign</FIELD_22> <FIELD_30>2.50</FIELD_30> </Sheet1> </DocumentElement> 以下样式表正在创建以下 XML: <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:var='urn:var' xmlns:user='urn:user' exclude-result-prefixes='msxsl var user' version='1.0'> <xsl:output method="xml" indent="yes"/> <xsl:template match="/DocumentElement"> <DocumentElement> <xsl:choose> <xsl:when test="normalize-space(/DocumentElement/Sheet1[1]/FIELD_1) = 'HD' and normalize-space(/DocumentElement/Sheet1[2]/FIELD_1) = 'DT'"> <xsl:apply-templates select="Sheet1[normalize-space(FIELD_1) = 'HD' and normalize-space(FIELD_2) != 'CusId' and normalize-space(FIELD_2) != 'CusID']" /> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="Sheet1[number(FIELD_2) = FIELD_2 and normalize-space(FIELD_1) != 'DT']" /> </xsl:otherwise> </xsl:choose> </DocumentElement> </xsl:template> <xsl:template priority="1" match="Sheet1[normalize-space(FIELD_1) = 'HD']"> <Invoice> <Ships> <xsl:variable name="prevC" select="count(preceding-sibling::*[normalize-space(FIELD_1) = 'DT' and FIELD_2 != 'CustomerId' and FIELD_2 != 'TrackingNbr'])"/> <xsl:variable name="newC" select="count(following-sibling::*[normalize-space(FIELD_1) = 'HD'][1]/preceding-sibling::*[normalize-space(FIELD_1) = 'DT' and FIELD_2 != 'CustomerId' and FIELD_2 != 'TrackingNbr'])"/> <xsl:variable name="pos" select="count(following-sibling::*[ normalize-space(FIELD_1) = 'HD'][1])" /> <xsl:apply-templates select="following-sibling::*[normalize-space(FIELD_1) = 'DT'][position() &lt; ($newC - $prevC + 1) or $pos = 0]" > <xsl:with-param name="data" select="FIELD_3" /> </xsl:apply-templates> </Ships> </Invoice> </xsl:template> <xsl:template priority="1" match="Sheet1[normalize-space(FIELD_1) = 'DT']" > <xsl:param name="scac"/> <Ship> <Lines> <Line> <xsl:attribute name="ReferenceNumber" > <xsl:value-of select="normalize-space(FIELD_13)"/> </xsl:attribute> <LineCharge > <xsl:attribute name="Charge" > <xsl:choose> <xsl:when test="normalize-space(FIELD_22) = 'Sign'"> <xsl:value-of select="'TS5'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="'TS0'"/> </xsl:otherwise> </xsl:choose> </xsl:attribute> <xsl:attribute name="Amount" > <xsl:value-of select="format-number(translate(FIELD_30,'$,()',''),'###0.00')"/> </xsl:attribute> </LineCharge> </Line> </Lines> </Ship> </xsl:template> </xsl:stylesheet> XML 输出: <DocumentElement> <Invoice> <Ships> <Ship> <Lines> <Line ReferenceNumber="0339618701316335"> <LineCharge Charge="TS0" Amount="8.41"/> <LineCharge Charge="TS2" Amount="0.16"/> </Line> </Lines> </Ship> <Ship> <Lines> <Line ReferenceNumber="0339618701316335"> <LineCharge Charge="TS0" Amount="2.50"/> </Line> </Lines> </Ship> </Ships> </Invoice> </DocumentElement> 第一个目标:当FIELD_13中有多个具有相同值的Sheet1元素时,创建一个Ship元素。在上面的代码中添加了以下 if 语句,以防止第二个 Ship 元素被捕获: <xsl:if test="not(preceding-sibling::*[normalize-space(FIELD_1) = 'DT' and FIELD_13 = current()/FIELD_13])"> NEW OUTPUT 仅显示一个 Ship 元素,这是正确的: <DocumentElement> <Invoice> <Ships> <Ship> <Lines> <Line ReferenceNumber="0339618701316335"> <LineCharge Charge="TS0" Amount="8.41"/> </Line> </Lines> </Ship> </Ships> </Invoice> </DocumentElement> 新问题是第二个 LineCharge 元素现在被跳过。 <LineCharge Charge="TS0" Amount="2.50"/> 我仍然需要嵌套在第二个 Ship 元素中的第二个 LineCharge 元素,但这一次,作为第一个 Ship 元素中的子元素,如下所示: <DocumentElement> <Invoice> <Ships> <Ship> <Lines> <Line ReferenceNumber="0339618701316335"> <LineCharge Charge="TS0" Amount="8.41"/> <LineCharge Charge="TS5" Amount="2.50"/> </Line> </Lines> </Ship> </Ships> </Invoice> </DocumentElement> 如何实现最终的 XML? 非常感谢您对此提供的任何帮助。 以下是慕尼黑分组的示例,可以帮助您入门: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:key name="key1" match="Sheet1[FIELD_1='DT']" use="FIELD_13"/> <xsl:template match="/DocumentElement"> <DocumentElement> <Invoice> <Ships> <!-- group by FIELD_13 --> <xsl:for-each select="Sheet1[FIELD_1='DT'][generate-id()=generate-id(key('key1', FIELD_13)[1])]"> <Ship> <Lines> <Line ReferenceNumber="{FIELD_13}"> <!-- process current group --> <xsl:for-each select="key('key1', FIELD_13)"> <LineCharge Charge="" Amount="{FIELD_30}"/> </xsl:for-each> </Line> </Lines> </Ship> </xsl:for-each> </Ships> </Invoice> </DocumentElement> </xsl:template> </xsl:stylesheet> XML 输入: <DocumentElement> <Sheet1> <FIELD_1>HD</FIELD_1> <FIELD_13>100</FIELD_13> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_13>101</FIELD_13> <FIELD_30>8.41</FIELD_30> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_13>101</FIELD_13> <FIELD_30>2.50</FIELD_30> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_13>102</FIELD_13> <FIELD_30>5.62</FIELD_30> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_13>103</FIELD_13> <FIELD_30>4.59</FIELD_30> </Sheet1> <Sheet1> <FIELD_1>DT</FIELD_1> <FIELD_13>103</FIELD_13> <FIELD_30>9.97</FIELD_30> </Sheet1> </DocumentElement> 您将得到: <?xml version="1.0"?> <DocumentElement> <Invoice> <Ships> <Ship> <Lines> <Line ReferenceNumber="101"> <LineCharge Charge="" Amount="8.41"/> <LineCharge Charge="" Amount="2.50"/> </Line> </Lines> </Ship> <Ship> <Lines> <Line ReferenceNumber="102"> <LineCharge Charge="" Amount="5.62"/> </Line> </Lines> </Ship> <Ship> <Lines> <Line ReferenceNumber="103"> <LineCharge Charge="" Amount="4.59"/> <LineCharge Charge="" Amount="9.97"/> </Line> </Lines> </Ship> </Ships> </Invoice> </DocumentElement>

回答 1 投票 0

XSLT 用元素替换子字符串,同时保留其他内联元素

我有一个包含文本的 xml 文档和一个包含单词列表的 xml 文档。我想从文本列表中搜索单词并将它们括在新标签中,同时保留其他所有内容不变。简而言之,...

回答 1 投票 0

如何使用 XSLT 删除命名空间声明但保留 XML 中的前缀

我在某些节点上有一个带有前缀和名称空间声明的 XML,我想删除该声明但保留前缀。 当前的 XML 显示如下 我在某些节点上有一个带有前缀和命名空间声明的 XML,我想删除该声明但保留前缀。 当前的 XML 显示如下 <Body> <n1:ParentNode xmlns:n1="test1" xmlns:n2="test2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <School> <n1:SchoolInfo xmlns:n1="test1"> <SchoolID1> <n2:ID xmlns:n2="test2">BAS123</n2:ID> <SchoolID1> </n1:SchoolInfo> </School> </Body> 我希望结果如下 XML: <Body> <n1:ParentNode xmlns:n1="test1" xmlns:n2="test2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <School> <n1:SchoolInfo> <SchoolID1> <n2:ID>BAS123</n2:ID> <SchoolID1> </n1:SchoolInfo> </School> </Body> 使用 XSLT 解决该问题的最简单方法是什么?任何帮助,将不胜感激。 谢谢!! 只需使用恒等变换,多余的内部命名空间声明就会消失。

回答 1 投票 0

XSLT 在引用变量时“包含”函数

仍在学习 XML/XSLT,所以如果我做了一些愚蠢的事情,请原谅我。 我正在尝试根据“类型”主列表(也在文件内)过滤 XML 文件的节点。我是

回答 1 投票 0

XslCompiledTransform XSLT 调试

根据这篇文章,我应该能够通过断点然后在最后一行代码上按 F11 来调试我的 xslt 转换: XslCompiledTransform xslt = new(true); xslt.Load(stylesheetUri);

回答 1 投票 0

使用 XSL 设置 XML 格式

我正在使用java DOM读取xml文件,向其中插入一个新元素(标签),然后将其存储到文件中。我想按它的属性之一对其进行排序,在保存文件时使用 XSL....

回答 1 投票 0

当相同的元素可以同时作为父元素和子元素出现时,如何递归删除父元素?

我正在使用 XML 模式生成器为特定系统生成的一组 XML 文档创建模式。我使用这个生成的模式来生成 Java 代码来读取和写入...

回答 1 投票 0

有没有办法将 <xsl:message> 内的颜色命令从 Saxon XSLT 发送到控制台 (wt.exe)?

在使用典型的 CMD/Bat 文件进行处理以在 MS Windows 中启动 XSLT3.0 样式表时,我尝试将上下文颜色添加到我的 输出中。 经过多次失败的尝试后我

回答 1 投票 0

如何测试xslt中子节点的值

我有一个像这样的XML: ABC 西北 66890 <

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.