xslt-2.0 相关问题

将此标记用于特定于XSL Transformations版本2.0的问题,而不是其他版本。

使用python删除xslt中重复的变量声明

假设我有这个使用 altova mapforce 生成的 xslt 2.0 代码 <...

回答 1 投票 0

控制 JSON 中 xml 的序列化

xslt 3.0 撒克逊 PE 11.4 我已经让它工作了,但纯属偶然。 考虑这个输入。 xslt 3.0 撒克逊 PE 11.4 我已经让这个工作了,但是是偶然的。 考虑这个输入。 <?xml version="1.0" encoding="UTF-8"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"> </Workbook> 我想得到这个JSON(编码很难......所以我想我需要转义“”字符,而且我不太担心“/”的JSON转义) { "xmlData": "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"><\/Workbook>" } 所以基本上一些外部伪代码就可以了。 json = JSON.Read("file.json") xmlString = json["xmlDate"] xml = XDocument.Parse(xmlString) 并且 xml 被读入某个 xml 模型。 所以我的尝试是这样的。 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:array="http://www.w3.org/2005/xpath-functions/array" exclude-result-prefixes="map array"> <xsl:output method="json"/> <xsl:template match="/"> <xsl:variable name="transformed-xml"> <xsl:copy-of select="."/> </xsl:variable> <xsl:map> <xsl:map-entry key="'xmlData'" select="serialize($transformed-xml)"/> </xsl:map> </xsl:template> </xsl:stylesheet> 第一次尝试 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:array="http://www.w3.org/2005/xpath-functions/array" exclude-result-prefixes="map array"> <xsl:output method="json"/> <xsl:template match="/"> <xsl:variable name="transformed-xml"> <xsl:copy-of select="."/> </xsl:variable> <xsl:variable name="json-string"> <!-- Convert the transformed XML to a JSON string --> <xsl:value-of select="serialize($transformed-xml)"/> </xsl:variable> <xsl:map> <xsl:map-entry key="'xmlData'" select="$json-string"/> </xsl:map> </xsl:template> </xsl:stylesheet> 给了我这个 { "xmlData": "&lt;Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"&gt;\n&lt;\/Workbook&gt;" } 讨厌...它的“xml”转义了“<','>”,而新行...不是100%确定为什么,我假设序列化是将字符串转义为“xml”格式,因为它在其中嵌入了“文本”节点文档节点? 好的...尝试2 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:array="http://www.w3.org/2005/xpath-functions/array" exclude-result-prefixes="map array"> <xsl:output method="json"/> <xsl:template match="/"> <xsl:variable name="transformed-xml"> <xsl:copy-of select="."/> </xsl:variable> <xsl:map> <xsl:map-entry key="'xmlData'" select="serialize($transformed-xml)"/> </xsl:map> </xsl:template> </xsl:stylesheet> 给予 { "xmlData": "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\">\n<\/Workbook>" } 有效!因为它不是第一次将其嵌入到文档节点内的文本节点中? 附注我认为这是一个明智的方法,以后不会咬我? JSON 输出可以序列化节点所以 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="#all"> <xsl:output method="json" indent="yes"/> <xsl:template match="/"> <xsl:sequence select="map { 'xmlData' : . }"/> </xsl:template> </xsl:stylesheet> 给出例如(撒克逊 HE 12.3) { "xmlData":"<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\">\n<\/Workbook>" } 所以基本上我不确定为什么你尝试在自己的代码中序列化 XML。

回答 1 投票 0

使用 XSLT 2.0 重构 XML 层次结构

有一个XML文件,结构为Transaction/isaPartners/Partner/Header/Item,isaPartner下有多个Partner。 <

回答 1 投票 0

检查 xslt 代码中是否有重复的变量名称并替换它们

我使用自动生成的代码工具来生成 xslt 代码,但我发现了一个问题。有时,声明的变量名是相同的,这会导致我的实现出现问题。让我

回答 1 投票 0

使用 XSLT 合并/连接共享属性值的相邻标签,而不会丢失子标签

我有 XHTML 内容,其中存在具有相同 href 值的相邻锚标记,需要合并。我一直在尝试找出一种使用 XSL 模板执行此操作的方法,但遇到了

回答 1 投票 0

如何将 AFP/PDF 的总页数转换为 XSL FO 中的 .txt 文件

我正在使用 Apache fop 生成 AFP 和 PDF 文件。 一切都工作得很好,但我正在努力解决一件事。 我可以使用以下命令获取每个文件的总页数: 我正在使用 Apache fop 生成 AFP 和 PDF 文件。 一切都工作得很好,但我正在努力解决一件事。 我可以使用以下命令获取每个文件的总页数: <fo:block text-align="right"> Page <fo:page-number/> of <fo:page-number-citation-last ref-id="end"/> </fo:block> 它在 AFP 和 PDF 上都能完美运行。 但是我还想实现另一件事 - 在 .txt 文件中获取总页数。 我正在使用结果文档创建 .txt 文件: <xsl:result-document href="{$FileName}.txt" method="text"> <xsl:value-of select="'abc'"/> </xsl:result-document> 在这里,我想知道文件的总页数。 我如何实现这一目标? 当写入文本文件时,您可以从 FOP 日志中提取页数。 (不是FOP用户,所以无法确认。) 或者,您可以在 PDF 上运行“pdfinfo”[1][2] 或类似的命令行实用程序来获取页数。 [1] https://superuser.com/questions/403672/how-to-count-pages-in-multiple-pdf-files [2] https://manpages.debian.org/jessie/poppler-utils/pdfinfo.1.en.html

回答 1 投票 0

XSLT - 使用 round() 函数

我有这样的XML内容, 20 20 20 100 160 有...

回答 5 投票 0

如何从 XML 有效负载中读取特定字段,该有效负载再次出现在主 XML 有效负载的字段中

需要帮助来读取字段之一内的 XML 有效负载。 请求有效负载: 需要帮助来读取字段之一内的 XML 有效负载。 请求负载: <?xml version="1.0" encoding="UTF-8"?> <Code xmlns:ns0="http://example.com"> <Header> <Field1>111</Field1> <Field2>text</Field2> </Header> <Trailer> &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; <Field4>Name</Field4> <Field5>EmployeeDetails</Field5> <Field6>Age</Field6> <Field7>Location</Field7> </Trailer> </Code> 上面是请求 XML 负载,其中有一个名为 <Trailer> 的字段 我们再次获得 XML 有效负载。我们只需要获取 从 <Trailer> 字段中的 XML 负载中选择的字段 并生成以下输出。 预期输出有效负载: <?xml version="1.0" encoding="UTF-8"?> <Code xmlns:ns0=http://example.com> <Header> <Field1>111</Field1> <Field2>text</Field2> </Header> <Field5>EmployeeDetails</Field5> <Field6>Age</Field6> <Field7>Location</Field7> </Field5> </Code> 我尝试使用下面的 XSLT,但我不幸从 <Trailer> 字段中获取所需字段 XSLT 代码: <?xml version='1.0'?> <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="/"> <Code> <xsl:copy-of select="//Header" /> <xsl:value-of select="//Trailer" disable-output-escaping="yes"/> </Code> </xsl:template> </xsl:stylesheet> 这是一种方法。 <?xml version='1.0'?> <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"/> <!-- Identity template. --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="Trailer"> <!-- Do not output the Trailer node or comments. Only output its child nodes. --> <xsl:apply-templates select="*"/> </xsl:template> <!-- Suppress Field4 --> <xsl:template match="Field4"/> </xsl:stylesheet> 问题不完全清楚。可以使用以下方法产生预期结果: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="Trailer"> <xsl:apply-templates select="Field5|Field6|Field7"/> </xsl:template> </xsl:stylesheet>

回答 2 投票 0

实现“依赖注入”的技术

我所说的“依赖注入”是指向代码传递某种指针的面向对象概念。在 FP 中,这可以使用高阶函数来完成。 在 xslt 2+ 中似乎有这些替代...

回答 1 投票 0

在 xsl 2.0 中从外部 for 循环访问值

我使用 xslt2.0 从另一个 xml 创建一个 xml。源xml如下所示- <

回答 1 投票 0

如何递归连接所有先前兄弟的所有文本?

这是我的 XML: 第一的 x y 第二 嘿 这是我的 XML: <?xml version="1.0"?> <foo> <a> first <b>x</b> <c>y</c> </a> <b>second</b> <bar>hey</bar> </foo> 这是我的 XSL: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/foo"> <xsl:apply-templates select="bar" /> </xsl:template> <xsl:template match="bar"> [<xsl:value-of select="preceding-sibling::text()"/>] </xsl:template> </xsl:stylesheet> 我期待这个: [first x y second] 但是,它并没有按预期工作。简而言之,我有兴趣(递归地)连接当前节点的所有兄弟节点的所有文本。 您选择的兄弟节点本身不是文本节点,因此您不能在 text() 轴之后立即使用 preceding-sibiling:: 节点测试。相反,您必须选择这些兄弟姐妹的文本后裔。 您可能还想省略纯空白文本,例如 <b> 和 <c> 元素之间的文本: [<xsl:for-each select="preceding-sibling::*//text() [normalize-space(.)!='']"> <!-- filter out whitespace-only --> <xsl:if test="position()>1"> <xsl:text> </xsl:text> </xsl:if> <xsl:value-of select="normalize-space(.)"/> </xsl:for-each>] 如果您希望文本以一个空格分隔,则必须显式插入该文本并使用 normalize-space 函数删除尾随和前导空格。 (XSLT 1.0) 你可以使用这样的东西: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/foo"> <xsl:apply-templates select="bar" /> </xsl:template> <xsl:template match="bar"> <xsl:text>[</xsl:text> <xsl:for-each select="preceding-sibling::*"> <xsl:value-of select="normalize-space(text())"/> <xsl:value-of select="' '"/> <xsl:apply-templates select="*" mode ="r"/> </xsl:for-each> <xsl:text>]</xsl:text> </xsl:template> <xsl:template match="*" mode="r"> <xsl:value-of select="normalize-space(text())"/> <xsl:value-of select="' '"/> <xsl:apply-templates select="*" mode="r"/> </xsl:template> </xsl:stylesheet> 看到它在这里工作:https://xsltfiddle.liberty-development.net/94rjSWw

回答 2 投票 0

XSLT:如何从上一个位置访问元素

我有以下输入 xml 文件: 40668825871 ANL 控制合格...

回答 1 投票 0

带有逗号分隔列表的节点。获取不同的值并创建新节点

我需要创建一个 xml 输出,将所有 wd:External_Value_Data/wd:Text 字段与每个不同的内部值分组。 ...

回答 1 投票 0

xsl 如何将 XML 文档作为变量应用到模板

我有这个基本模板,可以对 XML 文档中的某些节点进行排序和删除。当将 XML 文件作为 Saxon 命令的输入参数传递时,它在独立 XSLT 中按预期工作...

回答 1 投票 0

Xpath 有没有一种更简洁的方法来过滤多个“包含”条件?

并且(包含(BusinessType,'餐厅')或包含(BusinessType,'Pub')或包含(BusinessType,'外卖')) 上述内容按预期返回包含指定...的案例

回答 1 投票 0

XSLT - 如何增加性能时间

我编写了一个 XSLT 代码来获取员工和经理层次结构,该代码按预期工作,但处理 50,000 条记录大约需要 3 小时。 我相信这是由于创建变量时的循环......

回答 1 投票 0

删除与正则表达式不匹配的 XSLT2 元素

为了为文档创建目录,我搜索仅捕获 h[0-9] 节点并删除所有其他未在目录中的节点。 因此,在 XSLT2 中,我做了以下几行: 为了为文档创建目录,我搜索仅捕获 h[0-9] 节点并删除所有其他未在目录中放置的节点。 因此,在 XSLT2 中,我做了以下几行: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="*[not(matches(name(), '^h[0-9]$'))]"> <!-- This is the relevant line --> <!-- I let it empty in order to delet its content --> </xsl:template> </xsl:stylesheet> 我使用 saxon-xslt -o output.txt example.xml maketoc.xslt 编译它 但是,不幸的是,not(matches())模板不会影响目标行。而且基本不影响线路。 那么,如何删除所有不匹配h[0-9]正则表达式的节点呢? 您还没有显示源文档,但最可能的解释是源文档最外层元素的名称与 h[0-9] 不匹配,这意味着该元素将被删除,并且其子元素将被删除不予处理。 也许你应该添加一条规则 <xsl:template match="*[*]"> <xsl:apply-templates select="*"/> </xsl:template> 确保处理继续到此类元素的子元素。

回答 1 投票 0

如何使用 xslt 2.0 合并两个 xml 输入变量而不使用 for-each 循环

我们需要处理InputVar1中的每个employeeNumber,从InputVar2中获取相应的部门值,并将以下输出格式映射到OuputVar。我们不需要出示员工记录

回答 1 投票 0

XSLT - 根据另一个元素子值删除元素

我正在尝试根据另一个元素子值删除元素。 这是示例 xml 文件: 我正在尝试根据另一个元素子值删除元素。 这是示例 xml 文件: <Information> <List> <Element ID="101278"> <MetaData> <Value AttributeID="DisplayOrNo">no</Value> </MetaData> </Element> <Element ID="101277"> <MetaData> <Value AttributeID="DisplayOrNo">yes</Value> </MetaData> </Element> </List> <Products> <Product ID="3333"> <Name>test_name</Name> <Values> <Value ElementID="101278">test_text</Value> <Value ElementID="101277">test_text</Value> </Values> </Product> </Products> </Information> 如果元素列表/元素/元数据/值的值为否,我想删除产品/值中的元素值。 值元素将具有有关元素的 ID 属性的信息。这可能有助于匹配它们。 我期待这样的事情: <Information> <List> <Element ID="101278"> <MetaData> <Value AttributeID="DisplayOrNo">no</Value> </MetaData> </Element> <Element ID="101277"> <MetaData> <Value AttributeID="DisplayOrNo">yes</Value> </MetaData> </Element> </List> <Products> <Product ID="3333"> <Name>test_name</Name> <Values> <Value ElementID="101277">test_text</Value> </Values> </Product> </Products> </Information> 您认为在匹配和删除 Value 元素之后,还可以完全删除 Information 中的整个 List 吗?或者我是否必须制作第二个 XSLT 才能删除 List ? 应该看起来像这里: <Information> <Products> <Product ID="3333"> <Name>test_name</Name> <Values> <Value ElementID="101277">test_text</Value> </Values> </Product> </Products> </Information> 当前支持的大多数 XSLT 处理器版本都支持 XSLT 3.0(当前版本)或 XSLT 1.0。所以假设你使用例如当前支持 XSLT 2 的 Saxon 版本,它还将支持 XSLT 3 累加器: <?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="#all" version="3.0"> <xsl:mode on-no-match="shallow-copy" use-accumulators="display" streamable="yes"/> <xsl:accumulator name="display" as="xs:string*" initial-value="()" streamable="yes"> <xsl:accumulator-rule match="List/Element[@ID]/MetaData/Value[@AttributeID = 'DisplayOrNo']/text()[. = 'yes']" select="$value, string(ancestor::Element/@ID)"/> </xsl:accumulator> <xsl:template match="List"/> <xsl:template match="Products/Product/Values/Value[not(@ElementID = accumulator-before('display'))]"/> </xsl:stylesheet> 以下是如何在 XSLT 2.0(甚至 XSLT 1.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:key name="elem-by-id" match="Element[MetaData/Value[@AttributeID='DisplayOrNo']='yes']" use="@ID" /> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="List"/> <xsl:template match="Value[not(key('elem-by-id', @ElementID))]"/> </xsl:stylesheet>

回答 2 投票 0

如何在 DITA-OT 日志中记录和打印消息?

我在 DITA-OT 3.4 中创建了一个名为 com.myorg.dita.html5 的自定义插件,它是基本插件 org.dita.html5 的扩展。该插件已正确设置并按预期运行。 在...

回答 1 投票 0

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