xslt 相关问题

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

Saxon HE 12.4 无法在 ErrorReporter 中提供错误位置

提供自定义 ErrorReporter 时,Saxon HE v12.4 无法提供错误 XSLT 指令的错误位置。 注意:这在 v9.8 中有效,因为报告提供了异常,其中包含...

回答 1 投票 0

使用 XSLT 将 XML 文本节点中的字符转换为下标或上标

我有一个结构如下的 XML 文件: 二氧化碳{2} 二氧化碳 我将如何使用 XSLT 来...

回答 1 投票 0

如何在多个线程中使用 net.sf.saxon.s9api.XsltTransformer 以避免影响性能和吞吐量?

在我的项目中,我尝试在多个线程中使用 net.sf.saxon.s9api.XsltTransformer 使用 java 中的同步,因为根据文档 XsltTransformer 不得在

回答 1 投票 0

XSLT 3.0 转型

尝试转换 xml 并按 xslt 3.0 中的值和元素对节点进行分组 嘿伙计们,我有一个输入 xml,如下所示 尝试在 xslt 3.0 中转换 xml 并按值和元素对节点进行分组 嘿伙计们,我有一个输入 xml 如下 <?xml version='1.0' encoding='UTF-8'?> <Applications> <Application> <applicationId>280</applicationId> <cust_IDCheckIDCollation> <Option> <id>197249</id> </Option> </cust_IDCheckIDCollation> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>292</applicationId> <cust_IDCheckIDCollation> <Option> <id>197249</id> </Option> </cust_IDCheckIDCollation> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>280</applicationId> <cust_OnlineReferenceCheck> <Option> <id>197249</id> </Option> </cust_OnlineReferenceCheck> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>292</applicationId> <cust_OnlineReferenceCheck> <Option> <id>197249</id> </Option> </cust_OnlineReferenceCheck> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>280</applicationId> <cust_AustralianWorkRights> <Option> <id>197250</id> </Option> </cust_AustralianWorkRights> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>292</applicationId> <cust_AustralianWorkRights> <Option> <id>197250</id> </Option> </cust_AustralianWorkRights> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>280</applicationId> <cust_NationalPoliceCheck> <Option> <id>197249</id> </Option> </cust_NationalPoliceCheck> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> <Application> <applicationId>292</applicationId> <cust_NationalPoliceCheck> <Option> <id>197249</id> </Option> </cust_NationalPoliceCheck> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> </Application> </Applications> 我需要按 applicationId 将其分组,然后按元素名称对其进行子分组以删除重复元素。 预期产出 <Applications> <Application> <applicationId>280</applicationId> <cust_IDCheckIDCollation> <Option> <id>197249</id> </Option> </cust_IDCheckIDCollation> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> <cust_OnlineReferenceCheck> <Option> <id>197249</id> </Option> </cust_OnlineReferenceCheck> <cust_AustralianWorkRights> <Option> <id>197250</id> </Option> </cust_AustralianWorkRights> <cust_NationalPoliceCheck> <Option> <id>197249</id> </Option> </cust_NationalPoliceCheck> </Application> <Application> <applicationId>292</applicationId> <cust_IDCheckIDCollation> <Option> <id>197249</id> </Option> </cust_IDCheckIDCollation> <cust_overallduedilligencestatus> <Option> <id>197276</id> </Option> </cust_overallduedilligencestatus> <cust_OnlineReferenceCheck> <Option> <id>197249</id> </Option> </cust_OnlineReferenceCheck> <cust_AustralianWorkRights> <Option> <id>197250</id> </Option> </cust_AustralianWorkRights> <cust_NationalPoliceCheck> <Option> <id>197249</id> </Option> </cust_NationalPoliceCheck> </Application> <Applications> 在 xslt 3.0 中是否有更简单的方法来做到这一点。 我在 xslt 2.0 中编写了以下内容,但它没有返回预期的结果。 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/Applications"> <xsl:copy> <xsl:for-each-group select="Application" group-by="applicationId"> <xsl:copy> <xsl:for-each-group select="current-group()/*" group-by="name()"> <xsl:element name="{current-grouping-key()}"> <xsl:value-of select="(current-group())[1]"/> </xsl:element> </xsl:for-each-group> </xsl:copy> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet>``` 我想你想做: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/Applications"> <xsl:copy> <xsl:for-each-group select="Application" group-by="applicationId"> <xsl:copy> <xsl:copy-of select="applicationId"/> <xsl:for-each-group select="current-group()/(* except applicationId)" group-by="name()"> <xsl:copy-of select="current-group()[1]"/> </xsl:for-each-group> </xsl:copy> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

如何高效地并行运行大量文件的 XSLT 转换?

我每次都必须定期在 1 个文件夹内转换大量 XML 文件(至少 100K)(基本上,来自解压缩的输入数据集),我想学习如何以最有效的方式做到这一点。 .

回答 3 投票 0

从Java代码调用Xalan方法

我正在学习 XSLT,我发现 Xalan 真的很有帮助。我知道 Xalan 可以通过命令行命令使用,例如: java -classpath .;%XALAN_JAR% org.apache.xalan.xslt.Process -IN input.x...

回答 2 投票 0

XSLT 从 xpath 变量返回多个值

定义了以下变量,用于传入正确的 ID,一个用于区域类代码,一个用于扇区类代码: 150050&...

回答 2 投票 0

如何在XSLT中获取特定父节点的子节点?

我有一个类似这样的输入: ABC 西北

回答 1 投票 0

XSL-FO 表行分页符

我有一个简单的 xsl-fo 表,用于显示违规行为的集合。每个违规都是表中一组 3 行。每个组的高度可以不同,某些违规属性较大

回答 1 投票 0

SaxonJS.XPath.evaluate( fn:transform() ) 的结果不返回根文档节点

对于 NodeJs 工具,我必须使用 XSLT 执行简单的 XML 转换。 我想使用 SaxonJs,但我不想参与整个 xslt3/sef 的事情(xslt 发生变化并且该工具需要 r...

回答 1 投票 0

如何从字符串中删除小数点

在查找 iby_trxn_documents 表时,我们有来自 Oracle 的摘录 Value(发票金额)是一个字符串。 示例如下: 54380 19.80 我想: 54380 美元 0 美分 19 多尔...

回答 1 投票 0

XSLTProcessor 未运行

我一直在绞尽脑汁试图弄清楚为什么以下 XSLTProcessor 调用不起作用。 XSL-T 一直在绞尽脑汁试图找出为什么以下 XSLTProcessor 调用不起作用。 XSL-T <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xml:space="default"> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> <xsl:strip-space elements="*"/> <xsl:param name="include-header" select="'false'"/> <xsl:template match="/"> <!--xsl:element name="row"--> <xsl:text>{</xsl:text> <xsl:apply-templates select="*"/> <!--/xsl:element--> <xsl:text>}</xsl:text> </xsl:template> <xsl:template match="*[count(descendant::*)=0]"> <xsl:param name="parent"/> <xsl:variable name="quote" select="'&quot;'"/> <xsl:variable name="thisName" select="name()"/> <xsl:variable name="precedingSibling" select="count(preceding-sibling::*[name()=$thisName])+1"/> <xsl:variable name="parentChild" select="concat($parent, '.',$thisName, $precedingSibling)"/> <xsl:value-of select="concat($quote,$parentChild, $quote, ': ', $quote, ., $quote, ',')"/> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="*"> <xsl:call-template name="recurse-descendents"/> </xsl:template> <xsl:template match="*[count(descendant::*)>0]"> <xsl:call-template name="recurse-descendents"/> </xsl:template> <xsl:template name="recurse-descendents"> <xsl:variable name="thisName" select="name()"/> <xsl:apply-templates select="*[count(descendant::*)=0]"> <xsl:with-param name="parent" select="concat($thisName, count(preceding-sibling::*[name()=$thisName])+1)"/> </xsl:apply-templates> <xsl:apply-templates select="*[count(descendant::*)>0]"/> </xsl:template> </xsl:stylesheet> 示例 XML <?xml version="1.0" encoding="UTF-8"?> <foods> <meats> <meat>Beef</meat> <meat>Chicken</meat> <meat>Lamb</meat> </meats> <fruits> <fruit>Orange</fruit> <fruit>Apple</fruit> <fruit>Banana</fruit> <fruit>Avacado</fruit> </fruits> <vegetables> <vegetable>Carrot</vegetable> <vegetable>Cellery</vegetable> <vegetable>Potato</vegetable> </vegetables> </foods> XML Spy 的输出(如预期) {"meats1.meat1": "Beef", "meats1.meat2": "Chicken", "meats1.meat3": "Lamb", "fruits1.fruit1": "Orange", "fruits1.fruit2": "Apple", "fruits1.fruit3": "Banana", "fruits1.fruit4": "Avacado", "vegetables1.vegetable1": "Carrot", "vegetables1.vegetable2": "Cellery", "vegetables1.vegetable3": "Potato", } 使用 XSLTProcessor 的 Javascript 代码(不起作用) async function GenerateTestCaseResponse(xml, testCase) { const domParser = new DOMParser(); const xsltProcessor = new XSLTProcessor(); const xslResponse = await fetch("transformer/generate-response-json.xslt"); const xslText = await xslResponse.text(); const xslStylesheet = domParser.parseFromString(xslText, "application/xml"); xsltProcessor.importStylesheet(xslStylesheet); var responseDomParser = new DOMParser(); var responseDocument = responseDomParser.parseFromString(xml, "text/xml"); var result = xsltProcessor.transformToDocument(responseDocument); console.log(result.body); return result; } 对 xsltProcessor.transformToDocument 的调用返回空,没有错误或异常。不知如何解决,如有任何想法,感激不尽。 正如评论中已经指出的,任意 XML 文档中都没有正文,您似乎无论如何都想使用输出方法文本和文本内容,因此请使用片段结果并访问其 textContent 属性,例如 const xsltSource = `<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xml:space="default"> <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/> <xsl:strip-space elements="*"/> <xsl:param name="include-header" select="'false'"/> <xsl:template match="/"> <!--xsl:element name="row"--> <xsl:text>{</xsl:text> <xsl:apply-templates select="*"/> <!--/xsl:element--> <xsl:text>}</xsl:text> </xsl:template> <xsl:template match="*[count(descendant::*)=0]"> <xsl:param name="parent"/> <xsl:variable name="quote" select="'&quot;'"/> <xsl:variable name="thisName" select="name()"/> <xsl:variable name="precedingSibling" select="count(preceding-sibling::*[name()=$thisName])+1"/> <xsl:variable name="parentChild" select="concat($parent, '.',$thisName, $precedingSibling)"/> <xsl:value-of select="concat($quote,$parentChild, $quote, ': ', $quote, ., $quote, ',')"/> <xsl:text> </xsl:text> </xsl:template> <xsl:template match="*"> <xsl:call-template name="recurse-descendents"/> </xsl:template> <xsl:template match="*[count(descendant::*)>0]"> <xsl:call-template name="recurse-descendents"/> </xsl:template> <xsl:template name="recurse-descendents"> <xsl:variable name="thisName" select="name()"/> <xsl:apply-templates select="*[count(descendant::*)=0]"> <xsl:with-param name="parent" select="concat($thisName, count(preceding-sibling::*[name()=$thisName])+1)"/> </xsl:apply-templates> <xsl:apply-templates select="*[count(descendant::*)>0]"/> </xsl:template> </xsl:stylesheet>`; const xmlSource = `<?xml version="1.0" encoding="UTF-8"?> <foods> <meats> <meat>Beef</meat> <meat>Chicken</meat> <meat>Lamb</meat> </meats> <fruits> <fruit>Orange</fruit> <fruit>Apple</fruit> <fruit>Banana</fruit> <fruit>Avacado</fruit> </fruits> <vegetables> <vegetable>Carrot</vegetable> <vegetable>Cellery</vegetable> <vegetable>Potato</vegetable> </vegetables> </foods>`; function GenerateTestCaseResponse(xmlSource, xsltSource) { const domParser = new DOMParser(); const xsltProcessor = new XSLTProcessor(); const xsltStylesheet = domParser.parseFromString(xsltSource, "application/xml"); xsltProcessor.importStylesheet(xsltStylesheet); var xmlDoc = domParser.parseFromString(xmlSource, "application/xml"); var result = xsltProcessor.transformToFragment(xmlDoc, xmlDoc).textContent; console.log(result); return result; } GenerateTestCaseResponse(xmlSource, xsltSource);

回答 1 投票 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

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