xslt 相关问题

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

非嵌套记录集的嵌套 for 循环

我的输入xml如下 1 FFC1 我的输入xml如下 <ns0:ProjectSync xmlns:ns0="http://XSLMapTesting.ProjectSync"> <Funder> <OID>1</OID> <FFC>FFC1</FFC> </Funder> <Funder> <OID>2</OID> <FFC></FFC> </Funder> <Funder> <OID>3</OID> <FFC>FFC3</FFC> </Funder> <Funder> <OID>4</OID> <FFC></FFC> </Funder> <ActiveBudget> <BudgetLines> <Fund> <ID>1</ID> </Fund> </BudgetLines> <BudgetLines> <Fund> <ID>4</ID> </Fund> </BudgetLines> </ActiveBudget> </ns0:ProjectSync> 我的映射xslt代码如下 <xsl:template match="/"> <xsl:apply-templates select="/s0:ProjectSync" /> </xsl:template> <!-- //////////////////////////////////////// ProjectSync template //////////////////////////////////////// --> <xsl:template match="/s0:ProjectSync"> <ns0:Projects> <Project> <Funders> <xsl:apply-templates select="Funder[*]" /> </Funders> <Budgets> <xsl:apply-templates select="ActiveBudget/BudgetLines[*]" /> </Budgets> </Project> </ns0:Projects> </xsl:template> <!-- //////////////////////////////////////// Funders template //////////////////////////////////////// --> <xsl:template match="Funder"> <Funder> <ID> <xsl:choose> <xsl:when test="FFC != ''"> <xsl:value-of select="FFC/text()"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="OID/text()" /> </xsl:otherwise> </xsl:choose> </ID> </Funder> </xsl:template> <!-- //////////////////////////////////////// BudgetLines template //////////////////////////////////////// --> <xsl:template match="ActiveBudget/BudgetLines"> <BudgetLine> <FundID> <xsl:value-of select="Fund/ID/text()" /> </FundID> </BudgetLine> </xsl:template> </xsl:stylesheet> 在上面的“BudgetLines 模板”中,我想应用一个逻辑,例如对于每个预算线,它都会迭代资助者记录集,并查看是否找到具有相同 ID 的资助者并且还填充了 FFC,然后应该映射 FFC。否则,基金/ID 应映射到输出 xml 中。下面的代码也定义了同样的逻辑: for-each select="BudgetLine" for-each select="Funder" choose when test="BudgetLine/Fund/ID = Funder/OID & Funder/FFC != ''" <xsl:value-of select="Funder/FFC/text()" /> break; otherwise <xsl:value-of select="BudgetLine/Fund/ID/text()" /> 上述 xml 的预期输出应如下所示 <ns0:Projects xmlns:ns0="http://XSLMapTesting.Projects"> <Project> <Funders> <Funder> <ID>FFC1</ID> </Funder> <Funder> <ID>2</ID> </Funder> <Funder> <ID>FFC3</ID> </Funder> <Funder> <ID>4</ID> </Funder> </Funders> <Budgets> <BudgetLine> <FundID>FFC1</FundID> </BudgetLine> <BudgetLine> <FundID>4</FundID> </BudgetLine> </Budgets> </Project> </ns0:Projects> 我该如何在 xsl 中实现这一点? 谢谢你 如果我正确理解您的要求,我建议您这样做: XSLT 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:strip-space elements="*"/> <xsl:key name="funder" match="Funder" use="OID" /> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="Funder"> <xsl:copy> <ID> <xsl:choose> <xsl:when test="FFC/text()"> <xsl:value-of select="FFC"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="OID"/> </xsl:otherwise> </xsl:choose> </ID> </xsl:copy> </xsl:template> <xsl:template match="ActiveBudget"> <Budgets> <xsl:apply-templates/> </Budgets> </xsl:template> <xsl:template match="BudgetLines"> <xsl:variable name="funder" select="key('funder', Fund/ID)" /> <BudgetLine> <FundID> <xsl:choose> <xsl:when test="$funder/FFC/text()"> <xsl:value-of select="$funder/FFC"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$funder/OID"/> </xsl:otherwise> </xsl:choose> </FundID> </BudgetLine> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

XSLT - 如何循环遍历每个条目,但打印出一行

首先我必须说,我不是 XML/XSLT 转换方面的专家。所以请耐心等待。 我有以下 XML 结构。 1 首先我必须说,我不是 XML/XSLT 转换方面的专家。所以请耐心等待。 我有以下 XML 结构。 <cac:InvoiceLine> <cbc:ID>1</cbc:ID> <cbc:Note>Some remark text</cbc:Note> <cbc:Note>Charge: 1234567*</cbc:Note> <cbc:Note>Quantity: 1000*</cbc:Note> <cbc:Note>Charge: 987654*</cbc:Note> <cbc:Note>Quantity: 5000*</cbc:Note> ... </cac:InvoiceLine> Charge 和 Quantity 已连接。 Charge 1234567 的 Quantity 为 1000 公斤。 现在我想循环遍历列表并在一行(!)中打印所有连接的数据,例如: 1000公斤收费1234567 5000公斤收费987654 我尝试了以下代码,但实际上此代码为每个 <cbc:Note> 字段打印一个新行。 <xsl:for-each select="./cbc:Note"> <xsl:choose> <xsl:when test="contains(.,'Charge:')"> <xsl:value-of select="substring-before(substring-after(.,'Charge:'),'*')"/> <br /> </xsl:when> <xsl:when test="contains(.,'Menge:')"> <xsl:value-of select="substring-before(substring-after(.,'Quantity:'),'*')"/> <br /> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> <br /> </xsl:otherwise> </xsl:choose> </xsl:for-each> 有什么想法可以解决这个问题吗? 尝试类似: <xsl:template match="cac:InvoiceLine"> <xsl:for-each select="cbc:Note[starts-with(., 'Charge: ')]"> <xsl:value-of select="substring-before(substring-after(following-sibling::cbc:Note[1], 'Quantity: '), '*')"/> <xsl:text> kg </xsl:text> <xsl:value-of select="substring-before(., '*')"/> <br/> </xsl:for-each> </xsl:template> 您可以在此处看到它的工作原理。

回答 1 投票 0

在 Azure DevOps Pipeline 中执行 XSLT

我有一个使用 Azure DevOps CICD 构建的 VSTO Visio Addin。 作为管道的一部分,我希望有一个阶段任务来自动执行 XSLT,该 XSLT 将处理各种 Visual Studio *.csproj

回答 1 投票 0

在 XSLT 1.0 中使用“/”分隔符连接值

我有带有产品参数(如颜色)的 XML。 黑色 白色 我想输出一个值...

回答 1 投票 0

XSLT 仅在没有匹配字符串时生成输出

这是我的 XSLT 代码片段: 这是我的 XSLT 代码片段: <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://www.oracle.com/retail/integration/base/bo/FileDesc/v1" xmlns:ns2="http://www.oracle.com/retail/integration/base/bo/FileRef/v1" exclude-result-prefixes="ns1 ns2"> <xsl:import href="File_Download_Functions.xsl"/> <xsl:output method="xml" version="1.0" encoding="UTF-8" standalone="yes" indent="yes"/> <xsl:param name="File_Properties"/> <!-- Root-level template that controls output based on matches --> <xsl:template match="/"> <xsl:choose> <!-- Check if there is any match for FileDesc or FileRef --> <xsl:when test="/ns1:FileDesc or /ns2:FileRef"> <!-- Apply templates only if match is found --> <xsl:apply-templates/> </xsl:when> <xsl:otherwise> <!-- No matches, output minimal root element --> <empty></empty> </xsl:otherwise> </xsl:choose> </xsl:template> <!-- Template for ns1:FileDesc --> <xsl:template match="/ns1:FileDesc"> <xsl:if test="contains(ns1:event_description, '-FLAG-N-FLAG-') and ($File_RType = 'FileCre' or $File_RType = 'FileHdrMod' or $File_RType = 'FileDtlMod' or $File_RType = 'FileDtlCre')"> <!-- Logic for ns1:FileDesc --> ... </xsl:if> </xsl:template> <!-- Template for ns2:FileRef --> <xsl:template match="/ns2:FileRef"> <xsl:if test="($File_RType) = 'FileDel'"> <!-- Logic for ns2:FileRef --> ... </xsl:if> </xsl:template> <!-- Other templates --> <xsl:template name="get_arnotts_location"> <!-- Logic for get_arnotts_location --> </xsl:template> <xsl:template name="splitStringToLocs"> <!-- Logic for splitStringToLocs --> </xsl:template> </xsl:stylesheet> 问题: 当有匹配的模板时,转换效果很好。但是,当没有任何模板匹配时,仍然会创建一个 XML 文件,其中仅包含 XML 声明: tried to add the block with conditions with Root-level 'template that controls output based on matches' 尽管如此,仍然会创建一个仅包含 XML 声明的空输出文件。有没有办法在找不到匹配项时阻止创建文件?或者我的方法中遗漏了一些东西?任何指导将不胜感激! 我在这里遗漏了什么信息吗? 我可以看到像这样的文档<ns1:FileDesc/>将满足模板中与when匹配的/子句,但是根元素将不匹配任何模板,除了XML声明之外什么也不输出。 我怀疑您试图使用与 / 匹配的模板实现的目标是,如果其他模板都不与根元素匹配,则返回 <empty></empty>。如果我理解正确,那么我认为您应该删除与 / 匹配的模板并将其替换为: <xsl:template match="/*"> <empty><!-- fallback --></empty> </xsl:template> 如果您的特定模板之一与根元素匹配,则上述模板将被忽略,但如果没有一个特定模板与根元素匹配,则上述模板将匹配它。非常通用的 match="/*" 属性自动赋予它比任何与其他可能的根元素与更具体的 match 表达式相匹配的模板更低的优先级。

回答 1 投票 0

XML TEI 到 HTML

我正在尝试编写一个xsl文件,以便将给定的xml转换为html(用于发布)。这是我的示例 xml: 我正在尝试编写一个 xsl 文件,以便将给定的 xml 转换为 html(用于发布)。这是我的示例 xml: <text xml:lang="grc"> <body> <div type="edition" n="urn:cts:greekLit:tlg0059.tlg010.perseus-grc2" xml:lang="grc"> <div type="textpart" subtype="section" resp="perseus" n="11"> <p><said who="#Σωκράτης"><milestone unit="page" resp="Stephanus" n="11"/> <milestone unit="section" resp="Stephanus" n="11a"/><label>ΣΩ.</label> ὅρα δή, Πρώταρχε, τίνα λόγον μέλλεις παρὰ Φιλήβου δέχεσθαι νυνὶ καὶ πρὸς τίνα τὸν παρʼ ἡμῖν ἀμφισβητεῖν, <milestone unit="section" resp="Stephanus" n="11b"/> ἐὰν μή σοι κατὰ νοῦν ᾖ λεγόμενος. βούλει συγκεφαλαιωσώμεθα ἑκάτερον;</said></p> <p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> πάνυ μὲν οὖν.</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> Φίληβος μὲν τοίνυν ἀγαθὸν εἶναί φησι τὸ χαίρειν πᾶσι ζῴοις καὶ τὴν ἡδονὴν καὶ τέρψιν, καὶ ὅσα τοῦ γένους ἐστὶ τούτου σύμφωνα· τὸ δὲ παρʼ ἡμῶν ἀμφισβήτημά ἐστι μὴ ταῦτα, ἀλλὰ τὸ φρονεῖν καὶ τὸ νοεῖν καὶ μεμνῆσθαι καὶ τὰ τούτων αὖ συγγενῆ, δόξαν τε ὀρθὴν καὶ ἀληθεῖς λογισμούς, τῆς γε ἡδονῆς ἀμείνω καὶ λῴω γίγνεσθαι σύμπασιν ὅσαπερ <milestone unit="section" resp="Stephanus" n="11c"/> αὐτῶν δυνατὰ μεταλαβεῖν· δυνατοῖς δὲ μετασχεῖν ὠφελιμώτατον ἁπάντων εἶναι πᾶσι τοῖς οὖσί τε καὶ ἐσομένοις. μῶν οὐχ οὕτω πως λέγομεν, ὦ Φίληβε, ἑκάτεροι;</said></p> <p><said who="#Φίληβος"><label>ΦΙ.</label> πάντων μὲν οὖν μάλιστα, ὦ Σώκρατες.</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> δέχῃ δὴ τοῦτον τὸν νῦν διδόμενον, ὦ Πρώταρχε, λόγον;</said></p> <p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> ἀνάγκη δέχεσθαι· Φίληβος γὰρ ἡμῖν ὁ καλὸς ἀπείρηκεν.</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> δεῖ δὴ περὶ αὐτῶν τρόπῳ παντὶ τἀληθές πῃ περανθῆναι;</said></p> <p><said who="#Πρώταρχος"><milestone unit="section" resp="Stephanus" n="11d"/><label>ΠΡΩ.</label> δεῖ γὰρ οὖν.</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> ἴθι δή, πρὸς τούτοις διομολογησώμεθα καὶ τόδε.</said></p> <p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> τὸ ποῖον;</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> ὡς νῦν ἡμῶν ἑκάτερος ἕξιν ψυχῆς καὶ διάθεσιν ἀποφαίνειν τινὰ ἐπιχειρήσει τὴν δυναμένην ἀνθρώποις πᾶσι τὸν βίον εὐδαίμονα παρέχειν. ἆρʼ οὐχ οὕτως;</said></p> <p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> οὕτω μὲν οὖν.</said></p> <p><said who="#Σωκράτης"><label>ΣΩ.</label> οὐκοῦν ὑμεῖς μὲν τὴν τοῦ χαίρειν, ἡμεῖς δʼ αὖ τὴν τοῦ φρονεῖν;</said></p> <p><said who="#Πρώταρχος"><label>ΠΡΩ.</label> ἔστι ταῦτα.</said></p> 我想以粗体突出显示标签,并且理想情况下,将里程碑部分(如 11b)放置在文本的左边距(但我不知道如何开始执行后一项任务)。 这是我写的xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/HTML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="label"> <b> <xsl:apply-templates/> </b> </xsl:template> <xsl:template match="p"> <p> <xsl:apply-templates/> </p> </xsl:template> </xsl:stylesheet> 但输出是纯文本,没有中断,也没有粗体。任何提示将不胜感激! 您的 XSLT 文件几乎已步入正轨,但它有几个问题需要解决,以实现具有粗体标签和里程碑的所需 HTML 格式。以下是您可以进行的调整和添加: 1.命名空间 您的 XML 没有特定的命名空间,但 XSLT 文件引用了 HTML 命名空间。删除或修改它以确保 XSLT 正确匹配 XML 中的元素。 2.处理 milestone 元素 要将 milestone 元素放置在左边距中,您可以为 milestone 创建特定模板。一种简单的方法是在 <span> 元素内设置它们的样式,并使用 CSS 将它们定位在边距中。 3.格式化输出 为了确保 HTML 输出看起来正确,请为 said、label 和 milestone 等元素指定其他样式和模板。 这是经过这些更改的修订版 XSLT: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Transformed Text</title> <style> /* Style for labels in bold */ .label { font-weight: bold; } /* Style for milestones on the left margin */ .milestone { float: left; margin-right: 10px; color: gray; } /* Styling paragraphs */ p { margin-left: 20px; text-indent: -20px; } </style> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <!-- Template for paragraphs --> <xsl:template match="p"> <p> <xsl:apply-templates/> </p> </xsl:template> <!-- Template for labels with bold formatting --> <xsl:template match="label"> <span class="label"> <xsl:apply-templates/> </span> </xsl:template> <!-- Template for milestone elements to place them on the left --> <xsl:template match="milestone"> <span class="milestone"> <xsl:value-of select="@n"/> </span> </xsl:template> <!-- Template for 'said' elements --> <xsl:template match="said"> <div> <xsl:apply-templates/> </div> </xsl:template> </xsl:stylesheet> 变更说明: 命名空间更正:删除了 xmlns="http://www.w3.org/1999/HTML",因为它会干扰选择 XML 元素。 CSS 样式:<style> 块中的 CSS 用于: 使用 .label 类的粗体标签。 使用 milestone 类将 .milestone 元素浮动到左边距。 模板: <milestone>元素包裹在<span class="milestone">中,@n用于显示里程碑编号。 <label> 元素包裹在 <span class="label"> 中以实现大胆的样式。 这应该创建一个组织更加直观的 HTML 输出,并在左边距中带有粗体标签和里程碑。

回答 1 投票 0

vs2022 xsl 归档与其他实例不同的授权集。 (H结果:0x80131401)

几天以来,我的 Visual Studio 2022 无法打开 xslt 文件。 它可以打开其他文件,甚至是 xml。 从现在开始我使用单独的 xsl 文件,但是当我制作项目 xslt 文件时仍然不起作用 有没有人有...

回答 1 投票 0

XSLT 3.0 将 JSON 处理为 XML:从未调用过数组模板 - 优先级规则不清楚

在 XSLT 3.0 中,我想以标准方式处理通过从包含对象和简单值数组的 JSON 输入调用 json-to-xml() 隐式生成的 XML。解决方案...

回答 1 投票 0

如何对 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 &gt; $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 输入时,结果将呈现为:

回答 1 投票 0

在 XSLT 1.0 中使用结构(用于 xPath 翻译)时出现问题

我们公司有一个系统,定期从客户系统获取xml文件。 我们使用 xslt 将数据从客户结构转换为我们数据库支持的 xPath 结构。 95%...

回答 1 投票 0

如何使用命名空间前缀进行转换?添加它 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 方法。

回答 1 投票 0

我正在使用 DITA-OT 将 .dita 转换为 .pdf。我不明白如何更改标题的大小?

下午好!我正在使用 Oxygen XML Author 26.1 来开发 DITA 文档映射。然后我使用 DITA Open Toolkit 4.2.3(预安装的 org.dita.pdf2 插件)将 file.dita 转换为文件 .pdf。我...

回答 1 投票 0

使用 XSLT 将 JSON 转换为 XML(基本问题/13007280)

我管理包含书名、作者和语言的书籍列表。有时一个盒子(“coffret”)包含许多书。 我尝试了 questions/13007280 中的 XSLT 代码:它工作得很好,但仅适用于...

回答 1 投票 0

为什么我的 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 处理器会忽略该属性。

回答 1 投票 0

希望使用来自 Saxon 的 Java 或 .NET 调用从 XSLT 执行 HTTP POST

我使用一种专有工具,通过 Saxon 10 引擎利用 XSLT。 我正在寻找一种将有效负载从 XSL 发送到 API 端点的方法。对于 GET 来说,有效负载太大(这......

回答 1 投票 0

XSLTProcessor::transformToUri():内存分配失败:达到任意 MAX_URI_LENGTH 限制

我有一些 XML 文件需要在 Html 中“转换”并显示在屏幕上。 我使用 DOMDocument 和 XSLTProcessor 开发了一个几乎在任何时候都可以工作的简单脚本。 亲...

回答 2 投票 0

格式化 XSLT 以将 * 添加到数字中

对 XSLT 格式相当陌生,并尝试让它根据 1 个输入输出 2 个数字。 我尝试了一些方法但没有成功。 假设它从已链接的 TelephoneNumber 获取 8989...

回答 1 投票 0

与 xslt:apply-templates 的混淆

我不明白应用模板在 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 的其他子级的内置模板也不会被实例化。

回答 1 投票 0

在 XSLT 中创建列

请帮助使用基本的 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>

回答 2 投票 0

将 XSL-FO 转换为 HTML

我被要求查看一些旧的 XSL-FO 样式表并将它们转换为 XSLT (HTML),以便我可以获得 HTML 输出。 我能找到的唯一工具是 RenderX XSLFOToHTML 中的工具,但我不知道...

回答 1 投票 0

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