XSLT是XML的一种转换语言,旨在将结构化文档转换为其他格式(如XML,HTML和纯文本,或者在XSLT 3,JSON中)。问题应该根据需要使用xslt-1.0,xslt-2.0或xslt-3.0标记之一。
XSLT:由于 xsdate 或 current-date(),代码无法在 notepad++ 中运行
我有一个 xml 代码,用于显示员工的合同详细信息。 我只需要显示无限期的合同(没有结束日期)和尚未结束的合同(结束日期是
使用 XSLT 3 将外部生成的 json 文件转换为 xml
我一直在检查SO中的相关条目,到目前为止没有运气,因为我的用例似乎有一些共同点,但也与提供的解决方案存在差异(例如:使用...将json数组转换为xml)
如何防止C#中XML到HTML转换方法中出现OutOfMemoryException
我使用以下方法使用 C# 中的 XSLT 样式表将 XML 数据转换为 HTML。但是,在处理大型 XML 数据时,我遇到了 OutOfMemoryException。我该如何优化这个
我已提出请求并收到正确的答复: https://stackoverflow.com/a/78638030/23979545 现在我必须在之前的请求中添加一个条件: 初始 xml 文件: <...
我正在尝试使用 XSLT 将额外的节点添加到 XML 文件,但我在命名空间方面遇到了麻烦。 输入 XML 我正在尝试使用 XSLT 将额外的节点添加到 XML 文件,但我在命名空间方面遇到了麻烦。 输入XML <?xml version="1.0" encoding="utf-8"?> <AuditFile xmlns="urn:StandardAuditFile-Taxation-Financial:DK" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:doc="urn:schemas-OECD:schema-extensions:documentation"> <Header> <AuditFileVersion>1.0</AuditFileVersion> <AuditFileCountry>DK</AuditFileCountry> <AuditFileDateCreated>2024-06-19</AuditFileDateCreated> <Company> <RegistrationNumber /> <Name>usdk</Name> <Address> <StreetName /> <Number /> <City /> <PostalCode /> <Country>DK</Country> <AddressType>PostalAddress</AddressType> </Address> <Contact> <ContactPerson> <FirstName>NotUsed</FirstName> <LastName /> </ContactPerson> </Contact> <TaxRegistration> <TaxRegistrationNumber /> <TaxType>VAT</TaxType> <Country>DN</Country> </TaxRegistration> </Company> <DefaultCurrencyCode>EUR</DefaultCurrencyCode> <SelectionCriteria> <SelectionStartDate>2024-06-19</SelectionStartDate> <SelectionEndDate>2024-06-19</SelectionEndDate> </SelectionCriteria> <TaxAccountingBasis>Fakturaregnskab</TaxAccountingBasis> <TaxEntity>Afdeling</TaxEntity> </Header> </AuditFile> 所需的输出(将电话添加到联系人) <AuditFile xmlns="urn:StandardAuditFile-Taxation-Financial:DK" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:doc="urn:schemas-OECD:schema-extensions:documentation"> <Header> <AuditFileVersion>1.0</AuditFileVersion> <AuditFileCountry>DK</AuditFileCountry> <AuditFileDateCreated>2024-06-19</AuditFileDateCreated> <Company> <RegistrationNumber /> <Name>usdk</Name> <Address> <StreetName /> <Number /> <City /> <PostalCode /> <Country>DK</Country> <AddressType>PostalAddress</AddressType> </Address> <Contact> <ContactPerson> <FirstName>NotUsed</FirstName> <LastName /> </ContactPerson> <Telephone>123456789</Telephone> </Contact> <TaxRegistration> <TaxRegistrationNumber /> <TaxType>VAT</TaxType> <Country>DN</Country> </TaxRegistration> </Company> <DefaultCurrencyCode>EUR</DefaultCurrencyCode> <SelectionCriteria> <SelectionStartDate>2024-06-19</SelectionStartDate> <SelectionEndDate>2024-06-19</SelectionEndDate> </SelectionCriteria> <TaxAccountingBasis>Fakturaregnskab</TaxAccountingBasis> <TaxEntity>Afdeling</TaxEntity> </Header> </AuditFile> 经过一番努力,我想出了以下 XSLT: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:faia="urn:StandardAuditFile-Taxation-Financial:DK"> <xsl:variable name="urnStandardAuditFile">urn:OECD:StandardAuditFile-Taxation/2.00</xsl:variable> <xsl:template match="*"> <xsl:element name="{local-name()}" namespace="{$urnStandardAuditFile}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> <xsl:template match="text() | comment() | processing-instruction()"> <xsl:copy/> </xsl:template> <xsl:template match="faia:Contact"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <Telephone></Telephone> </xsl:copy> </xsl:template> </xsl:stylesheet> 但这不断给我提供带有命名空间的节点,这是我不想要的。 <Contact xmlns="urn:StandardAuditFile-Taxation-Financial:DK"> <ContactPerson xmlns="urn:OECD:StandardAuditFile-Taxation/2.00"> <FirstName>NotUsed</FirstName> <LastName/> </ContactPerson> <Telephone xmlns="urn:OECD:StandardAuditFile-Taxation/2.00">123456789</Telephone> <Telephone xmlns=""/> </Contact> 任何帮助将非常感激。 我认为你需要做的只是: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dk="urn:StandardAuditFile-Taxation-Financial:DK" xmlns="urn:StandardAuditFile-Taxation-Financial:DK"> <xsl:output method="xml" indent="yes"/> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="dk:Contact"> <xsl:copy> <xsl:apply-templates/> <Telephone>123456789</Telephone> </xsl:copy> </xsl:template> </xsl:stylesheet>
在 XSLT 1.0 中,如何使用 key 和 document('') 对嵌入 XSLT 中的 XML 数据创建查找函数?
我的具体需求是查找给定特定字体大小的行高,但我正在寻求学习创建查找/特定映射的通用技术。 我认为嵌入 XML 我是可能的...
我有一个 XProc 脚本,当前对文档 href 进行硬编码,如下所示: 我有一个 XProc 脚本,当前对文档 href 进行硬编码,如下所示: <p:xslt> <p:input port="source"/> <p:input port="stylesheet"> <p:document href="/path/to/stylesheet.xsl"/> </p:input> </p:xslt> 我想将 /path/to/stylesheet.xsl 作为选项传递给 xproc 脚本,因此在我的声明步骤中我输入: <p:option name="stylePath" required="true"/> 但我仍然不知道如何用选项值替换 p:document 中的硬编码 href。 我将非常感谢您的帮助。 这最终对我有用: 创建一个步骤来加载文档并传递给它的选项: <p:load name="getStylesheetSource"> <p:with-option name="href" select="$stylePath" /> </p:load> 然后,在 XSLT 步骤中,通过管道传输加载的样式表 <p:xslt name="transform"> <p:input port="source"> <!-- etc. --> </p:input> <p:input port="stylesheet"> <p:pipe step="getStylesheetSource" port="result" /> </p:input> </p:xslt> 通过此设置,可以在调用 XProc 脚本时传递 stylePath 选项,而无需对路径进行硬编码。 与版本 1.0 相比,XProc 3.0 允许您使用属性值模板 (AVT)。 AVT 设置在花括号中,它们指示选项值应作为 XPath 表达式进行计算。这是一个 XProc 3.0 管道,其中选项 $stylesheet-path 设置为要动态评估的 AVT: <?xml version="1.0" encoding="UTF-8"?> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="3.0"> <p:input port="source"/> <p:output port="result"/> <p:option name="stylesheet-path"/> <p:xslt> <p:with-input port="stylesheet" href="{$stylesheet-path}"/> </p:xslt> </p:declare-step>
XSLT 中是否有一个函数可以接受目录路径并返回其中的所有文件? 我现在有一个 xml 文件,内容如下 文件A.xml ...
我的 POST 请求中有 XML 数据,需要基于 C# 代码执行一些映射。它基本上是读取 XML 数据并在使用多个 C# 代码时对某些字段执行一些更新
我知道 XML 不允许其中包含 NUL 字节,但我认为它可以以某种方式与 JSON 一起使用: parse-json("""\u0000""") => 序列化(map{"method": &quo...
我对 xsl 几乎没有经验,并继承了这个样式表。这是 ACH 付款,付款日期必须是创建日期后 1 天。问题:当日期为 01-08 时,它会删除前导 0 和
我需要你的帮助。我在 XSLT 上遇到了困难:例如,我有一个像这样的 XML 文件: 博特 尼尔斯 我需要你的帮助。我在 XSLT 上遇到了困难:例如,我有一个像这样的 XML 文件: <Adresses> <Person id="1"> <Name>Bott</Name> <Vorname>Nils</Vorname> </Person> <Person id="2"> <Name>Hubert</Name> <Vorname>Hubertus</Vorname> </Person> <Person id="3"> <Name>Large</Name> <Vorname>Lars</Vorname> </Person> <Numbers> <number> <id>1</id> <tel>12354</tel> </number> <number> <id>3</id> <tel>32354</tel> </number> <number> <id>2</id> <tel>22354</tel> </number> </Numbers> </Adresses> 我必须转换为订单 HTML 表。 HTML 表应如下所示(在 ID 之后排序): <table> <tr> <th>Name</th> <th>Vorname</th> <th>Tel</th> </tr> <tr> <th>Bott</th> <th>Nils</th> <th>12354</th> </tr> </table> 我的问题是我不知道如何检查:选择 Peron.id = number.id ...的数字...如果有人能给我这个问题的完整示例,那就太好了。在网络搜索中,教程中总是没有那么复杂;-( ....我正在学习 XSLT 并且只知道一些规则,例如 apply-templates match="Person" ....但是在这样的情况下怎么可能调用另一个选择正确号码的模板的语句? 我尝试从这个开始: <xsl:template match="/"> <html> <body> <xsl:for-each select="Adresses/Person"> <xsl:call-template name="curPos"> </xsl:call-template> <xsl:value-of select="Name"/> <xsl:value-of select="Vorname"/> </xsl:for-each> </body> </html> </xsl:template> <xsl:template name="curPos" match="Person"> <xsl:value-of select="position()"/><br> </br> </xsl:template> 我的问题是我不知道如何检查:选择其中的号码 Peron.id = number.id .... 这正是键的用途: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:key name="num" match="number" use="id" /> <xsl:template match="/Adresses"> <html> <body> <table> <tr> <th>Name</th> <th>Vorname</th> <th>Tel</th> </tr> <xsl:for-each select="Person"> <tr> <td> <xsl:value-of select="Name"/> </td> <td> <xsl:value-of select="Vorname"/> </td> <td> <xsl:value-of select="key('num', @id)/tel"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> 请注意,您的表结构假设每个人只有一个电话号码(如您的示例所示)。但是,XML 结构表明人员和电话号码之间存在一对多关系,因此您可能需要考虑更改: <td> <xsl:value-of select="key('num', @id)/tel"/> </td> 至: <td> <xsl:for-each select="key('num', @id)"> <xsl:value-of select="tel"/> <br/> </xsl:for-each> </td> 我为您准备了以下 XSLT 2.0 解决方案: <xsl:template name="makeTable"> <table> <tr> <th>Name</th> <th>Vorname</th> <th>Tel</th> </tr> <xsl:for-each select="/Adresses/Person"> <tr> <td><xsl:value-of select="Name"/></td> <td><xsl:value-of select="Vorname"/></td> <td><xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/></td> </tr> </xsl:for-each> </table> </xsl:template> 现在,据我了解,您遇到的问题是找到正确的 XPath 表达式来选择正确的电话号码。在这种情况下最重要的代码是这一行: <td> <xsl:value-of select="../Numbers/number[id = current()/@id]/tel"/> </td> 在 XSLT 2.0 中 - 我不确定 XSLT 1.0 - 您可以使用 XPath 中的 current() 函数引用当前循环元素。 要选择电话号码,我会在其 id 等于当前循环元素属性 id 的条件下过滤号码,然后获取该节点的子节点 tel 以获得实际号码。
[XSLT 1.0] 我的 xml 输入中有这个: 断线测试断线测试断线测试 我只需要更换...
我正在使用 Apache FOP 2.1 生成 PDF 文件。 为此,我尝试将默认语言设置为英语。 这应该在通过 Adobe Reader 的 o 创建 PDF 后进行验证...
我有一个 HTML 表格,其中的 元素可以跨越多行: ... 我有一个 HTML 表格,其中包含可以跨越多行的 <td> 元素: <table border="1"> <tbody> <tr> <th>A</th> <th>B</th> <th>C</th> <th>D</th> </tr> <tr> <th>1</th> <td rowspan="2">B12</td> <td>C1</td> <td rowspan="3">D123</td> </tr> <tr> <th>2</th> <td rowspan="2">C23</td> </tr> <tr> <th>3</th> <td>B3</td> </tr> </tbody> </table> 我想从中生成表格格式: A B C D A1 B12 C1 D123 A2 B12 C23 D123 A3 B3 C23 D123 我正在尝试使用 XPath 3.1 来做到这一点(我并不反对 XQuery 或 XSLT 解决方案,但我认为他们在这里不能做得更好): //table/tbody/( let $matx := map:merge((1 to count(tr)) ! map:entry(.,map{})) return tr/( let $x := position() return *[name() = "td" or name() = "th"]/( let $str := string(), $pos := position(), $row := $matx($x), $y := ($pos to 1 + max(($pos, map:keys($row)))) => filter(function($i){ not(map:contains($row,$i)) }) => head() return ($x to $x + (if (@rowspan) then xs:integer(@rowspan) - 1 else 0)) => fold-left($matx, function($m,$i) { $m => map:put($i, $m($i) => map:put($y, $str)) }) ) ) ) 主要问题是我无法在循环 $matx 时更新全局 <tr>。我目前正在尝试用 fold-left 重构代码,但它已经变得一团糟。我希望有一个更简单的解决方案。 我在纯 XPath 中得到了第一个可行的解决方案。主要困难是使用 position() 时无法访问 fold-left()。 正如 @MartinHonnen 评论的那样,https://github.com/transpect/htmltables 中有一个 XSL 函数用于“扁平化”HTML 表格。如果您正在使用 XSLT,那么就不必费心使用 XPath; htmltable:normalize 甚至可以处理 colspan 属性,而我不这样做(尽管添加它应该不会太难)。 //table/tbody/( let $tr_seq := *, $i_seq := 1 to count($tr_seq) return $i_seq => fold-left(array{$i_seq ! map{}}, function($arr, $i) { let $tr := $tr_seq[$i], $td_seq := $tr/*, $j_seq := 1 to count($td_seq) return $j_seq => fold-left($arr, function($arr, $j) { let $td := $td_seq[$j], $data := normalize-space($td), $rowspan := max((1, $td ! xs:integer(@rowspan))), $map := $arr($i), $j2 := ($j to max(($j, map:keys($map))) + 1) => filter(function($k){ not(map:contains($map, $k)) }) => head() return ($i to $i + $rowspan - 1) => fold-left($arr, function($arr,$i) { $arr => array:put($i, $arr($i) => map:put($j2, $data)) }) }) }) => array:for-each(function($m) { map:keys($m) => sort() => for-each($m) }) ) 这里你得到了一个代表 HTML 表的数组(行 x 列),每个原子元素都是对应的 <td> 或 <th> 的规范化字符串: [ ["A","B","C","D"], ["A1","B12","C1","D123"], ["A2","B12","C23","D123"], ["A3","B3","C23","D123"] ] 然后您可以根据需要格式化该矩阵: ! ( array:for-each(., string-join(?, codepoints-to-string(9))) => string-join(codepoints-to-string(10)) ) A B C D A1 B12 C1 D123 A2 B12 C23 D123 A3 B3 C23 D123 A B
我需要将不使用任何模式的 XML 文档转换为使用定义良好的模式的另一种格式。 所以基本上我必须改变这个: 我需要将不使用任何模式的 XML 文档转换为使用定义良好的模式的另一种格式。 所以基本上我必须改变这个: <healthCareFacilityTypeCode displayName="Home" codingScheme="Connect-a-thon healthcareFacilityTypeCodes" >Home</healthCareFacilityTypeCode> 进入此: <healthCareFacilityTypeCode> <code>Home</code> <displayName> <LocalizedString value="Home" /> </displayName> <schemeName>Connect-a-thon healthcareFacilityTypeCodes</schemeName> </healthCareFacilityTypeCode> 我知道如何通过查看架构来手动转换它。这是 XSD 的片段: <xsd:complexType name="DocumentEntryType"> <xsd:sequence> <xsd:element minOccurs="0" name="healthCareFacilityTypeCode" type="tns:CodedMetadataType"/> </xsd:sequence> <xsd:attribute default="false" name="existing" type="xsd:boolean" use="optional"/> </xsd:complexType> <xsd:element name="DocumentEntry" type="tns:DocumentEntryType"/> 我不知道如何解决的是:如何利用目标 XSD 将节点从源 XML 转换为目标 XML 文档。我觉得执行转换的所有信息都位于 XSD 中,但我可以使用它吗?怎么办? 遵循建议,这就是我想到的。不完美,但足以满足我的目的。 <xsl:template match="XDSDocumentEntry"> <DocumentEntryType> <xsl:call-template name="namespaceChange"/> <xsl:apply-templates/> </DocumentEntryType> </xsl:template> <xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="//*[matches(name(), 'Code')]"> <xsl:copy> <code> <xsl:value-of select="."/> </code> <schemeName> <xsl:value-of select="@codingScheme"/> </schemeName> <displayName> <LocalizedString> <xsl:attribute name="value"> <xsl:value-of select="@displayName"/> </xsl:attribute> </LocalizedString> </displayName> </xsl:copy> </xsl:template>
我有一个如下所示的 XML 文件,我需要读取属性值并将其提取到内部表中。 但未获取值并且内部表仍为空。有的话请告诉我
如何对元素进行排序并根据具有命名空间的唯一元素或 ID 进行分组
我问了同样的问题,但没有问名称空间 我有一个像..this这样的xml 我问了同样的问题,但没有问命名空间 我有一个像..this这样的xml 237 NV0511201114 207 237 NV0511201119 212 237 NV0511201129 230 输出应该是这样的 237 NV0511201114 207 NV0511201119 212 NV0511201129 230 以下是下面的xslt,我正在尝试但没有得到想要的结果 我得到的输出与输入相同,没有变化。 也许我做错了,但不明白错误是什么......试图找出答案 在 xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/db/FinalDbGetUserId" 元素上定义 xsl:stylesheet,然后在样式表中匹配或选择该命名空间中的元素的任何位置使用前缀 ns0,例如<xsl:key name="kuserID" match="ns0:USERUBSCRIBERS" use="ns0:USER_ID"/> 和 <xsl:sort select="ns0:USER_ID" data-type="number"/>。 您似乎正在尝试使用 XSLT(XML 样式表语言转换)转换 XML 结构,其中元素根据 USER_ID 进行分组,但遇到输出保持不变的问题。让我们分析您的 XSLT 和 XML 结构,以识别潜在问题并提出改进建议。
XSLT 具有两次传递,因此相同的输入数据可以支持多个模板中的计算
我正在使用 XSLT 1.0 将 XML 转换为 XML。我需要至少执行两遍,以便可以计算第一遍的小计,并使用它在 XML 中输出总计 - 显示在