xslt 相关问题

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

如何更换 XML 标签

我尝试了一些方法,但无法用它来替换产品标签 我尝试了一些方法,但无法用它来替换产品标签 <?xml version="1.0" encoding="UTF-8"?> <products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://api.itscope.com/2.1/info/schema/developer.xsd"> <product> <name>Example Product</name> <price>10.00</price> </product> </products> 这是我的 XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsi"> <!-- Identitätstransformation: Kopiert alle Nodes und Attribute --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- Spezielle Transformation für das <products>-Tag mit den speziellen Namespaces und Attributen --> <xsl:template match="products[@xsi:schemaLocation]"> <products> <xsl:apply-templates select="@*|node()"/> </products> </xsl:template> </xsl:stylesheet> 我认为这是关于命名空间的,但我找不到问题。 这是我的目标: <?xml version="1.0" encoding="UTF-8"?> <products> <product> <name>Example Product</name> <price>10.00</price> </product> </products> 如果您使用身份转换作为基本模板并想要删除某些节点,请添加与这些节点匹配的空模板,例如 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="xsi"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- drop attribute --> <xsl:template match="products/@xsi:schemaLocation]"/> </xsl:stylesheet>

回答 1 投票 0

如何在xslt中循环子节点,根据节点类型请求特定输出

我有一个像这样的xml输入: 第1段 我有一个像这样的 xml 输入: <doc> <article> <text> <p> paragraph 1 </p> <p> paragraph 2 </p> <inter> inter 1 </inter> <p> paragraph 3 </p> <p> paragraph 4 </p> <inter> inter 2 </inter> <p> paragraph 5 </p> </text> </article> </doc> 我需要这样的输出: <doc> <article> <text> [TEXT] paragraph 1 paragraph 2 [INTER] inter 1 paragraph 3 paragraph 4 [INTER] inter 2 paragraph 5 </text> </article> </doc> 所以我尝试了这个xsl代码: <xsl:template match="/doc"> <doc> <article> <text> <xsl:text>[TEXT]&#xa;</xsl:text> <xsl:for-each select="article/texte"> <xsl:choose> <xsl:when test="p"> <xsl:value-of select="p"/> <xsl:text>&#xa;</xsl:text> </xsl:when> <xsl:when test="intertitre"> <xsl:text>[INTER]&#xa;</xsl:text> <xsl:value-of select="intertitre"/> <xsl:text>&#xa;</xsl:text> </xsl:when> </xsl:choose> </xsl:for-each> </text> </article> </doc> </xsl:template> 不工作…脚本似乎在第一个“p”子节点之后停止,所以我只得到这个输出: <doc> <article> <text> [TEXT] paragraph 1 </text> </article> </doc> 你有什么建议? “选择…何时”语句似乎可以完成这项工作,但可能不是,或者我只是错过了一些东西…(我对 xslt 很陌生…) 我会使用模板: <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="article/text"> <xsl:copy> <xsl:text>[TEXT]</xsl:text> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="text/p"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="text/inter"> <xsl:value-of select="concat('[INTER]', .)"/> </xsl:template> 在任何情况下,精确的缩进/空白处理可能都需要调整

回答 1 投票 0

使用 ApacheFOP 在 Java 中从 XML 生成 PDF

我正在尝试从 Java 对象生成即时 PDF 报告。我找不到很多这方面的例子,所以我一直在关注这个例子: http://svn.apache.org/viewvc/xmlgraphic...

回答 3 投票 0

XSLT:如何同时拆分多个字段的字符串

我看过很多关于使用 tokenize() 分割字符串的帖子,但它们都涉及单个字段。 我的情况略有不同,我不知道如何处理它。 我的 XML 可以重新设置...

回答 1 投票 0

使用 XSLT 进行一致的通用排序

我的输入是一些未排序的 XML,我想对其进行排序 - 首先按字母顺序排序,因为我在尝试使用 XSL 对 XML 文件进行排序时遇到了问题。我想对任意数量的嵌套节点进行排序,

回答 1 投票 0

尝试读取xml元素中的数据

我有以下xml 我有以下 xml <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <wsa:Action>http://cdr.ffiec.gov/public/services/RetrieveFacsimileResponse</wsa:Action> <wsa:MessageID>urn:uuid:f1c95072-c1ab-44f4-9c8f-59a26e28fce8</wsa:MessageID> <wsa:RelatesTo>urn:uuid:0f4a548e-39ad-4b5f-be02-ad9eaae75e32</wsa:RelatesTo> <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To> <wsse:Security> <wsu:Timestamp wsu:Id="Timestamp-ee96d970-c821-455d-9f92-75085fcad001"> <wsu:Created>2024-06-10T20:27:43Z</wsu:Created> <wsu:Expires>2024-06-10T20:32:43Z</wsu:Expires> </wsu:Timestamp> </wsse:Security> </env:Header> <soap:Body> <RetrieveFacsimileResponse xmlns="http://cdr.ffiec.gov/public/services"> <RetrieveFacsimileResult>TestData==</RetrieveFacsimileResult> </RetrieveFacsimileResponse> </soap:Body> </soap:Envelope> 我正在尝试像这样读取RetrieveFacsimileResult中的数据。 XmlDocument MyDoc = new XmlDocument(); MyDoc.LoadXml(response.Content); XmlNode MyNode = MyDoc.SelectSingleNode("xml/soap:Envelope/soap:Body/RetrieveFacsimileResponse/RetrieveFacsimileResult"); 我需要 Namespace Manager 或 XsltContext。该查询有前缀、变量或用户定义的函数。 如何读取RetrieveFacsimileResult里面的数据?? 请尝试以下使用 LINQ to XML API 的解决方案。自 2007 年以来,它在 .Net Framework 中可用。 显然,需要考虑默认命名空间。 c# void Main() { XDocument xdoc = XDocument.Parse(@"<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:wsa='http://schemas.xmlsoap.org/ws/2004/08/addressing' xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'> <env:Header xmlns:env='http://www.w3.org/2003/05/soap-envelope'> <wsa:Action>http://cdr.ffiec.gov/public/services/RetrieveFacsimileResponse</wsa:Action> <wsa:MessageID>urn:uuid:f1c95072-c1ab-44f4-9c8f-59a26e28fce8</wsa:MessageID> <wsa:RelatesTo>urn:uuid:0f4a548e-39ad-4b5f-be02-ad9eaae75e32</wsa:RelatesTo> <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To> <wsse:Security> <wsu:Timestamp wsu:Id='Timestamp-ee96d970-c821-455d-9f92-75085fcad001'> <wsu:Created>2024-06-10T20:27:43Z</wsu:Created> <wsu:Expires>2024-06-10T20:32:43Z</wsu:Expires> </wsu:Timestamp> </wsse:Security> </env:Header> <soap:Body> <RetrieveFacsimileResponse xmlns='http://cdr.ffiec.gov/public/services'> <RetrieveFacsimileResult>TestData==</RetrieveFacsimileResult> </RetrieveFacsimileResponse> </soap:Body> </soap:Envelope>"); XNamespace ns = "http://cdr.ffiec.gov/public/services"; var RetrieveFacsimileResult = xdoc.Descendants(ns + "RetrieveFacsimileResult")? .SingleOrDefault()?.Value; }

回答 1 投票 0

如何在xslt 1.0中显式计算for-each循环内的数字?

我需要统计并根据情况一一增加。 position() 函数在以下场景中没有用, 输入 XML: 我需要根据情况进行计数并逐一增加。 position() 函数在以下场景中没有用, 输入XML: <em> <doc> <info> <str>/abc/sdf</str> <str>/def/gjh</str> <str>/ghi/jhk</str> <str>/klm/jhhj</str> <str>/abc/hafghi</str> <str>/ghi/tyuxd</str> <str>/abc/ert</str> <str>/def/kjldg</str> <str>/abc/ghk</str> <str>/pqr/wsej</str> </info> </doc> </em> XSLT: <req> <xsl:for-each select="/em/doc/info/str"> <xsl:variable name="pos" select="position()"/> <xsl:if test="/em/doc/info/str[$pos] != '' and starts-with(/em/doc/info/str[$pos],'/abc/')"> <input> <inf> <xsl:valus-of select="/em/doc/info/str[$pos]"/> </inf> </input> </xsl:if> </xsl:for-each> <xsl:for-each select="/em/doc/info/str"> <xsl:variable name="pos" select="position()"/> <xsl:if test="/em/doc/info/str[$pos] != '' and starts-with(/em/doc/info/str[$pos],'/ghi/')"> <input> <inf> <xsl:valus-of select="/em/doc/info/str[$pos]"/> </inf> </input> </xsl:if> </xsl:for-each> </req> 所需输出: <req> <input> <inf>/abc/sdf</inf> </input> <input> <inf>/abc/hafghi</inf> </input> <nxtinput> <inf>/ghi/jhk</inf> </nxtinput> <nxtinput> <inf>/ghi/tyuxd</inf> </nxtinput> <nxtinput> <inf>/ghi/sdf</inf> </nxtinput> <nxtinput> <inf>/ghi/fgh</inf> </nxtinput> <nxtinput> <inf>/ghi/sfd</inf> </nxtinput> <nxtinput> <inf>/ghi/hgjgh</inf> </nxtinput> </req> 条件: 1. If '/em/doc/info/str' starts with '/abc/' then will populate under '/input/inf' up to two times only even if its matched more than two times. 2. If '/em/doc/info/str' starts with '/ghi/' then will populate under '/nxtinput/inf' up to six times only even if its matched more than six times. 上述 XSLT 不返回上述输出。它返回所有匹配的值。我想限制填充“/input/inf”和“nxtinput/inf”下的值,直到仅 2 次和 6 次。 您可能想做: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/em"> <req> <xsl:for-each select="doc/info/str[starts-with(., '/abc/')][position() &lt;= 2]"> <input> <inf> <xsl:value-of select="."/> </inf> </input> </xsl:for-each> <xsl:for-each select="doc/info/str[starts-with(., '/ghi/')][position() &lt;= 6]"> <nxtinput> <inf> <xsl:value-of select="."/> </inf> </nxtinput> </xsl:for-each> </req> </xsl:template> </xsl:stylesheet> 这首先选择满足条件的节点,然后对输出的节点数量进行限制。但结果与您显示的不同,因为没有足够的节点来填充配额。

回答 1 投票 0

如何使用 Nokogiri 单独评估 XSLT 表达式?

我们使用第三方提供的 XSLT 转换来验证 XML 文档;它将文档转换为错误节点的集合,如果 XML 文档为 val,则该集合将为空...

回答 1 投票 0

本地化 Microsoft Word 引文和参考书目样式(xsl 文件)

我想在MSWORD 2013中创建自定义参考书目样式,我使用这种样式。 我使用 IEEE_Reference.XSL 并应用了所需的更改。没关系。 但我的文章有多种语言

回答 2 投票 0

在之前在 XSLT 中分配了条件逻辑的标签内添加内部标签

我正在开发一个解析字符串测试(内的txt)的xslt,我想要这样: 我正在开发一个解析字符串测试(<root></root>内的txt)的xslt,我想要那个: <xsl:if test="starts-with(., ' 61')"> <xsl:variable name="IBAN" select="concat(substring(.,100,4),substring(.,52,23))" /> <Stmt> <Acct> <Id> <IBAN><xsl:value-of select="$IBAN"/></IBAN> </Id> </Acct> </Stmt> </xsl:if> 但是先例我已经在另一个 if 中创建了这个标签: 问题很简单:如何在优先父标签中插入标签? 我的代码是这样的: <xsl:template match="/"> <xsl:copy copy-namespaces="no"> <xsl:variable name="parts" select="str:split(root, ' RH')"/> <root> <xsl:for-each select="$parts"> <xsl:variable name="part" select="concat(' RH', .)" /> <xsl:variable name="lines" select="str:tokenize($part, '&#x0A;')"/> <Document> <BkToCstmrStmt> <GrpHdr> <xsl:for-each select="$lines"> <xsl:if test="starts-with(., ' RH')"> <Stmt> <Id><xsl:value-of select="concat(normalize-space(substring(., 20, 20)),'-1')"/></Id> <!-- perchè -1 possono esseci piu id? --> <ElctrncSeqNb>1</ElctrncSeqNb> <!-- Progressivo di rendicontazione elettronica da verificare come si vuole fare--> <CreDtTm><xsl:value-of select="concat($year, '-', $month, '-', $day, 'T', $hour, ':', $minute, ':', $second, 'Z')"/></CreDtTm> </Stmt> </xsl:if> <xsl:if test="starts-with(., ' 61')"> <xsl:variable name="IBAN" select="concat(substring(.,100,4),substring(.,52,23))" /> <Stmt> <Acct> <Id> <IBAN><xsl:value-of select="$IBAN"/></IBAN> </Id> </Acct> </Stmt> </xsl:if> </xsl:for-each> </GrpHdr> </BkToCstmrStmt> </Document> </xsl:for-each> </root> </xsl:copy> </xsl:template> 现在第二个 if 中的代码覆盖第一个 if 中的第一个 <STMT>。我只想插入。 输入xml: <root> RH03051CDSIA280524CM1490301951171 610000001 93001 G0305101700000000004575EUR270524C000000000000,00IT44 620000001001270524270524D000000000649,3450TE ITDA00DPN145 630000001001HAYS SRL/AVIS BUDGET ITALIA S.P.A./AR885265/2355070853/B2B/RCUR/OE5OA5200P4907R3 640000001EUR270524C000000000000,00 EF03051CDSIA280524CM1490301951171 0000001 0000006 RH03051CDSIA280524CM1490301951349 610000001 93001 Z0305101699000078389249USD270524C000000001320,97IT72 640000001USD270524C000000001320,97 EF03051CDSIA280524CM1490301951349 0000001 0000004 </root> 我想要转换后的xml: <root> <Document> <BkToCstmrStmt> <GrpHdr> <Stmt> <Id>CM1490301951171-1</Id> <ElctrncSeqNb>1</ElctrncSeqNb> <CreDtTm>2024-05-28T12:08:29Z</CreDtTm> <Acct> <Id> <IBAN>IT44G0305101700000000004575</IBAN> </Id> </Acct> </Stmt> </GrpHdr> </BkToCstmrStmt> </Document> </root> 但是我得到了这个: <root> <Document> <BkToCstmrStmt> <GrpHdr> <Stmt> <Id>CM1490301951171-1</Id> <ElctrncSeqNb>1</ElctrncSeqNb> <CreDtTm>2024-05-28T12:08:29Z</CreDtTm> </Stmt> <Stmt> <Acct> <Id> <IBAN>IT44G0305101700000000004575</IBAN> </Id> </Acct> </Stmt> </GrpHdr> </BkToCstmrStmt> </Document> </root> 有什么建议给我吗? 谢谢 问候 您的代码不完整,并且在未定义的变量上出错: <CreDtTm><xsl:value-of select="concat($year, '-', $month, '-', $day, 'T', $hour, ':', $minute, ':', $second, 'Z')"/></CreDtTm> AFAICT,您的输入应产生 3 个 Document 元素,但您的预期输出仅显示一个。 这不是一个最小的例子。 我猜(!)你想做类似的事情: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:str="http://exslt.org/strings" extension-element-prefixes="str"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <xsl:variable name="parts" select="str:split(root, ' RH')"/> <root> <xsl:for-each select="$parts"> <xsl:variable name="part" select="concat(' RH', .)" /> <xsl:variable name="lines" select="str:tokenize($part, '&#x0A;')"/> <xsl:variable name="line61" select="$lines[starts-with(., ' 61')]"/> <Document> <BkToCstmrStmt> <GrpHdr> <Stmt> <Id> <xsl:value-of select="concat(normalize-space(substring($lines[1], 20, 20)),'-1')"/> </Id> <ElctrncSeqNb>1</ElctrncSeqNb> <CreDtTm> <!-- ??? missing variables ??? --> </CreDtTm> <xsl:variable name="line61" select="$lines[starts-with(., ' 61')]"/> <xsl:if test="$line61"> <Acct> <Id> <IBAN> <xsl:value-of select="concat(substring(concat(substring($line61, 100, 4), substring($line61, 52, 23)),100, 4), substring($line61, 52, 23))"/> </IBAN> </Id> </Acct> </xsl:if> </Stmt> </GrpHdr> </BkToCstmrStmt> </Document> </xsl:for-each> </root> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

XRechnung Visualizer 和 Saxon-HE for .NET 的自闭合 DIV 标签存在问题

我想通过使用 itplr-kosit 的 xrechnung 可视化,使用 .NET/C# 实现 XRechnung 可视化工具,将 XRechnung 转换为 HTML。我使用 Saxonica 的 Saxon-HE 作为处理器。现在我正在挣扎......

回答 4 投票 0

警告:DOMDocument::loadXML():需要开始标记,'<' not found in Entity

我们从 .xml 文件导入产品 为了正确导入产品,我们首先必须创建一个 .xsl 文件,它将 .xml 文件从链接 URL 转换为我们的要求。 .xml 文件的链接看起来...

回答 1 投票 0

如何删除 xslt 中的子节点但仅针对 value-of 元素?

我有一个像这样的xml文档: 标题文字照片版权 我有一个像这样的 xml 文档: <doc> <article> <photo> <caption> <p> caption text<credit>photo copyright</credit> </p> </caption> </photo> </article> </doc> 正如您所看到的,“credit”标签嵌套在“p”标签中...... 我有一个像这样的xsl代码: <xsl:template match="/doc"> <caption> <xsl:for-each select="article/photo"> <xsl:value-of select="caption/p"/> <xsl:text>&#xa;</xsl:text> <xsl:value-of select="caption/p/credit"/> </xsl:for-each> </caption> </xsl:template> 所以我有这样的输出: <caption> caption text photo copyright photo copyright </caption> 我需要的只是删除嵌套的“credit”标签及其内容,但仅限于我的第一个 value-of 元素,因为我需要保留它作为我的第二个 value-of。所以我会得到这个输出: <caption> caption text photo copyright </caption> 这会更好,因为我不想重复照片版权......但我确实需要在标题文本和照片版权之间换行...... 你不能简单地做: <xsl:template match="/doc"> <caption> <xsl:for-each select="article/photo/caption/p//text()"> <xsl:value-of select="."/> <xsl:text>&#xa;</xsl:text> </xsl:for-each> </caption> </xsl:template>

回答 1 投票 0

使用样式表转换 XML:多个子元素

我有一个很大的公司数据 XML 文件。 我正在尝试提取名称数据,以便可以将其读入第三方应用程序中的平面表中。 到目前为止,我已经成功地管理了这个...

回答 1 投票 0

包 org.apache.struts2.views.xslt 在 struts2 core 6.3.0.2 库中不存在

我的应用程序是基于struts2构建的。我在代码中扩展 org.apache.struts2.views.xslt.XSLTResult 类。我收到此包不存在的错误。 那么自定义类就是你...

回答 1 投票 0

xsltproc 给出警告:“无法加载外部实体”和 xsl:include 到 HTTPS URL 的错误“xsl:include : 无法加载 ..”

我有一个如下所示的本地样式表,即它有一个 xsl:include ,其中的 href 属性指向 https URL: 我有一个如下所示的本地样式表,即它有一个 xsl:include 和指向 https URL 的 href 属性: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:include href="https://martin-honnen.github.io/xslt/foo-transform-module.xsl"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 对于我来说,在三个不同的系统上,xsltproc 无法处理本地样式表(例如 xsltproc xslt-test1.xsl sample1.xml),给我一个警告和一个错误: warning: failed to load external entity "https://martin-honnen.github.io/xslt/foo-transform-module.xsl" compilation error: file xslt-test1.xsl line 3 element include xsl:include : unable to load https://martin-honnen.github.io/xslt/foo-transform-module.xsl 其他 XSLT 处理器似乎能够找到并加载包含的样式表和输出,例如 <root> <transformed-foo>foo 1</transformed-foo> <bar>bar 1</bar> </root> 对于像这样的输入sample1.xml <root> <foo>foo 1</foo> <bar>bar 1</bar> </root> 我查看了 xsltproc 的选项,但只找到了一个选项 --nonet 禁止加载外部实体,我没有看到任何默认值可以解释为什么 HTTPS 访问失败。 任何人都可以重现此问题吗?如果没有,请告诉我需要哪个设置,以便 xsltproc 加载包含的 XSLT 模块? 看来,根据https://gitlab.gnome.org/GNOME/libxml2/-/blob/master/README.md,libxml/libxslt有多种构建选项是否包含模块,其中之一--with-http HTTP support (off),我假设 off 表示默认设置不包括 HTTP 支持。 我认为这可以解释这一点,我尝试的所有安装(各种 WSL Ubuntu Linux 版本下的 xsltproc 包)可能都是使用该默认设置构建的,因此没有 HTTP 支持。

回答 1 投票 0

根据条件显示某些字段的逻辑

这里是输入的xml 0000001Z 这里是输入xml <rows> <row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"> <SOURCEID__C>0000001Z</SOURCEID__C> <SOURCESYSTEM__C/> <NAME/> <Account.SourceId__c/> <Product2.SourceId__c/> <STATUS>Inactive</STATUS> <SERIALNUMBER/> <MACHINE_MODEL__C/> <MACHINE_TYPE__C/> <CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C> <CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C> <EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C> </row> <row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"> <SOURCEID__C>0000013</SOURCEID__C> <SOURCESYSTEM__C/> <NAME/> <Account.SourceId__c/> <Product2.SourceId__c/> <STATUS>Inactive</STATUS> <SERIALNUMBER/> <MACHINE_MODEL__C/> <MACHINE_TYPE__C/> <CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C> <CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C> <EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C> </row> </rows> 这是 xslt: <?xml version="1.0" encoding="UTF-8"?> <!-- produce comma separated values output --> <!-- follow all except last value by comma --> <!-- if value contains a comma, enclose it in double quotes --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/> <xsl:template match="/rows"> <xsl:element name="csvRoot"> <xsl:element name="csvString"> <xsl:for-each select="./row[1]"> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test="contains(current(),',')">"<xsl:value-of select="name(.)"/>"</xsl:when> <xsl:otherwise> <xsl:text>"</xsl:text><xsl:value-of select="name(.)"/><xsl:text>"</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:if test="position()!=last()">,</xsl:if> </xsl:for-each> <xsl:text> </xsl:text> </xsl:for-each> <xsl:for-each select="./row"> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test="lower-case(name(.)) = 'contact.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'recordtypeid' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'business_hours_id__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'businesshoursid' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'accountid__r.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'account.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'product2.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'location.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'asset.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'servicecontract.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="lower-case(name(.)) = 'parent.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when> <xsl:when test="current() = ''"><xsl:text>"#N/A"</xsl:text></xsl:when> <xsl:when test="contains(current(),'&quot;')"><xsl:text>"</xsl:text><xsl:value-of select="replace(., '&quot;', '&quot;&quot;')" /><xsl:text>"</xsl:text></xsl:when> <xsl:otherwise> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:if test="position()!=last()">,</xsl:if> </xsl:for-each> <xsl:text> </xsl:text> </xsl:for-each> </xsl:element> </xsl:element> </xsl:template> </xsl:stylesheet> 这是输出: <csvRoot><csvString>"SOURCEID__C","SOURCESYSTEM__C","NAME","Account.SourceId__c","Product2.SourceId__c","STATUS","SERIALNUMBER","MACHINE_MODEL__C","MACHINE_TYPE__C","CANCELLATION_DATE__C","CANCELLATION_REASON__C","EFFECTIVE_CANCELLATION_DATE__C" "0000001Z","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411" "0000013","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411" </csvString></csvRoot> 工作正常。我想添加额外的逻辑来显示某些字段(如果 SOURCEID__C 为空),然后仅填充 SOURCEID__C、CANCELATION_DATE、EFFECTIVE_CANCELLATION_DATE、CANCELATION_REASON 否则填充所有字段,就像我当前在输出中一样。 xsl 区分大小写。 SOURCEID__C 不在输入中,尽管 Account.SourceId__c 是,所以假设您的意思是 Account.SourceId__c xslt中也没有null的概念。您可以测试 value 是否='',或者是否不存在,即参见 count(.) 我建议您将条件应用于每一行,而不是应用于一行中的每个元素: <xsl:for-each select="./row"> <xsl:choose> <xsl:when test="Account.SourceId__c =''"> <!--Output whatever you want here --> <xsl:copy-of select="CANCELLATION_DATE" /></xsl:copy-of> </xsl:when> </xsl:choose> </xsl:for-each>

回答 1 投票 0

获取某个节点与其祖先之间的特定节点数

假设您有以下 XML 结构(无论字符串值是什么,在我的情况下它并不重要) ...

回答 1 投票 0

计算XSLT Price的平均值

我对 XSLT 有点困惑,我正在努力弄清楚如何计算 XSLT 中我所有汽车广告的平均价格。 所以我得到了这个 XML <...

回答 1 投票 0

XSL-FO:显示阿拉伯字符

拜托,我在使用 api fop 1.0 (XSL-FO) 以 PDF 格式生成的报告中显示阿拉伯语时遇到问题。 我配置了 userConfig.xml 以使用 Arial.ttf 字体。一切正常...

回答 2 投票 0

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