xslt-grouping 相关问题

分组特定于XSLT的机制。应始终使用xslt-1.0,xslt-2.0或xslt-3.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

XSLT:创建新的 xml/csv 结构

我想请求您的指导,以更好地实现所需的输出。我有一个我无法控制的 XSLT 文件,我想应用修改初始结构的转换......

回答 1 投票 0

XSLT 中嵌套分组中的值求和

我正在尝试在 XSLT 1.0 中进行嵌套分组,但遇到了一些问题,下面是我的 XML 示例代码。 我正在尝试在 XSLT 1.0 中进行嵌套分组,但遇到了一些问题,下面是我的 XML 示例代码。 <?xml version="1.0" encoding="iso-8859-1"?> <INVOICE> <GROUP ID="1"> <GROUP_HEADER_ROW> <COL width="2cm" headerAlign="start" headerFormat="text">Product Name</COL> <COL width="0cm" headerAlign="start" headerFormat="text">Product Code</COL> <COL width="2cm" headerAlign="start" headerFormat="text">Description</COL> <COL width="1cm" headerAlign="start" headerFormat="number">QTY</COL> <COL width="1cm" headerAlign="end" headerFormat="number">Price</COL> <COL width="1cm" headerAlign="end" headerFormat="number">Tax</COL> <COL width="1cm" headerAlign="end" headerFormat="number">Amount</COL> <COL width="3cm" headerAlign="start" headerFormat="text">Account</COL> <COL width="1cm" headerAlign="end" headerFormat="number">VAT</COL> <COL width="2cm" headerAlign="start" headerFormat="text">SubscriptionFromDate</COL> <COL width="2cm" headerAlign="start" headerFormat="text">SubscriptionToDate</COL> <COL width="2cm" headerAlign="start" headerFormat="text">PackageName</COL> <COL width="0cm" headerAlign="start" headerFormat="number">PackageID</COL> <COL width="0cm" headerAlign="start" headerFormat="text">BundleDesc</COL> <COL width="1cm" headerAlign="start" headerFormat="text">Note</COL> </GROUP_HEADER_ROW> <GROUP_DATA_ROW> <COL>Hotline</COL> <COL>ProdCode1</COL> <COL>Subscription</COL> <COL>1</COL> <COL>50</COL> <COL>0</COL> <COL>50</COL> <COL>Account1</COL> <COL/> <COL>2024-09-01T00:00:00.000000-05:00</COL> <COL>2024-09-30T23:59:59.000000-05:00</COL> <COL/> <COL/> <COL>GroupValue2</COL> <COL/> </GROUP_DATA_ROW> <GROUP_DATA_ROW> <COL>Direct Hit Mobile</COL> <COL>ProdCode2</COL> <COL>Subscription</COL> <COL>1</COL> <COL>100</COL> <COL>0</COL> <COL>100</COL> <COL>Account1</COL> <COL/> <COL>2024-09-01T00:00:00.000000-05:00</COL> <COL>2024-09-30T23:59:59.000000-05:00</COL> <COL/> <COL/> <COL>GroupValue2</COL> <COL/> </GROUP_DATA_ROW> <GROUP_DATA_ROW> <COL>Direct Hit Mobile</COL> <COL>ProdCode3</COL> <COL>Subscription</COL> <COL>1</COL> <COL>50</COL> <COL>0</COL> <COL>50</COL> <COL>Account2</COL> <COL/> <COL>2024-09-01T00:00:00.000000-05:00</COL> <COL>2024-09-30T23:59:59.000000-05:00</COL> <COL/> <COL/> <COL>GroupValue2</COL> <COL/> </GROUP_DATA_ROW> <GROUP_DATA_ROW> <COL>Direct Hit</COL> <COL>ProdCode4</COL> <COL>Subscription</COL> <COL>1</COL> <COL>100</COL> <COL>0</COL> <COL>100</COL> <COL>Account2</COL> <COL/> <COL>2024-09-01T00:00:00.000000-05:00</COL> <COL>2024-09-30T23:59:59.000000-05:00</COL> <COL/> <COL/> <COL>GroupValue2</COL> <COL/> </GROUP_DATA_ROW> </GROUP> </INVOICE> 我的目标是创建一个包含以下字段信息组的表格: COL[8] COL[14] COL[10] COL[11] 到目前为止我使用的 xslt 代码如下.. <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="groupAcct" match="/INVOICE/GROUP/GROUP_DATA_ROW" use="COL[8]"/> <xsl:key name="groupBunDesc" match="/INVOICE/GROUP/GROUP_DATA_ROW" use="concat(COL[8],COL[14],COL[10],COL[11])"/> <xsl:template match="INVOICE"> <xsl:for-each select="/INVOICE/GROUP/GROUP_DATA_ROW[count(. | key('groupAcct', COL[8])[1]) = 1]"> <xsl:sort select="COL[8]"/> <xsl:variable name="acctName" select="COL[8]"/> <h1> <xsl:value-of select="$acctName"/> </h1> <table id="{COL[8]}"> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[2]"/> </th> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[3]"/> </th> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[4]"/> </th> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[5]"/> </th> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[6]"/> </th> <th scope="col"> <xsl:value-of select="/INVOICE/GROUP/GROUP_HEADER_ROW/COL[7]"/> </th> <xsl:variable name="testVar" select="key('groupAcct', COL[8])"/> <xsl:for-each select="$testVar[count(. | key('groupBunDesc', concat(COL[8],COL[14],COL[10],COL[11]))[1]) = 1]"> <xsl:if test="COL[14] != ''"> <tr> <xsl:value-of select="COL[14]"/> </tr> <tr> <xsl:value-of select="COL[3]"/> </tr> <tr> <xsl:value-of select="COL[4]"/> </tr> <tr> <xsl:value-of select="COL[5]"/> </tr> <tr> <xsl:value-of select="COL[6]"/> </tr> <tr> <xsl:value-of select="COL[7]"/> </tr> </xsl:if> </xsl:for-each> </table> </xsl:for-each> </xsl:template> </xsl:stylesheet> 此 XSLT 打印的代码已按帐户正确分组,但并未为每个帐户仅打印 1 行,下面是当前输出。 <?xml version="1.0"?> <h1>Account1</h1> <table id="Account1"> <th scope="col">Product Code</th> <th scope="col">Description</th> <th scope="col">QTY</th> <th scope="col">Price</th> <th scope="col">Tax</th> <th scope="col">Amount</th> <tr>GroupValue2</tr> <tr>Subscription</tr> <tr>1</tr> <tr>50</tr> <tr>0</tr> <tr>50</tr> </table> <h1>Account2</h1> <table id="Account2"> <th scope="col">Product Code</th> <th scope="col">Description</th> <th scope="col">QTY</th> <th scope="col">Price</th> <th scope="col">Tax</th> <th scope="col">Amount</th> <tr>GroupValue2</tr> <tr>Subscription</tr> <tr>1</tr> <tr>50</tr> <tr>0</tr> <tr>50</tr> </table> 代码工作正常,但是,我无法对代码中的价格、税收和金额列进行求和。我期待以下输出。 <?xml version="1.0"?> <h1>Account1</h1> <table id="Account1"> <th scope="col">Product Code</th> <th scope="col">Description</th> <th scope="col">QTY</th> <th scope="col">Price</th> <th scope="col">Tax</th> <th scope="col">Amount</th> <tr>GroupValue2</tr> <tr>Subscription</tr> <tr>1</tr> <tr>150</tr> <!-- sum the group values--> <tr>0</tr> <tr>150</tr> <!-- sum the group values--> </table> <h1>Account2</h1> <table id="Account2"> <th scope="col">Product Code</th> <th scope="col">Description</th> <th scope="col">QTY</th> <th scope="col">Price</th> <th scope="col">Tax</th> <th scope="col">Amount</th> <tr>GroupValue2</tr> <tr>Subscription</tr> <tr>1</tr> <tr>150</tr> <!-- sum the group values--> <tr>0</tr> <tr>150</tr> <!-- sum the group values--> </table> 感谢您的帮助和知识。 考虑下面的调整,您可以在其中针对分组变量sum这些数值。此外,通过使用 xsl:apply-templates 您可以减少重复。 <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="groupAcct" match="GROUP_DATA_ROW" use="COL[8]"/> <xsl:key name="groupBunDesc" match="GROUP_DATA_ROW" use="concat(COL[8],COL[14],COL[10],COL[11])"/> <xsl:template match="GROUP_HEADER_ROW"> <xsl:apply-templates select="COL[position() &gt;= 2 and position() &lt;= 7]"/> </xsl:template> <xsl:template match="GROUP_HEADER_ROW/COL"> <th scope="col"> <xsl:value-of select="text()"/> </th> </xsl:template> <xsl:template match="INVOICE"> <xsl:for-each select="GROUP/GROUP_DATA_ROW[count(. | key('groupAcct', COL[8])[1]) = 1]"> <xsl:sort select="COL[8]"/> <xsl:variable name="curr-group" select="key('groupAcct', COL[8])" /> <h1> <xsl:value-of select="$curr-group/COL[8]"/> </h1> <table id="{$curr-group/COL[8]}"> <xsl:apply-templates select="ancestor::GROUP/GROUP_HEADER_ROW"/> <xsl:for-each select="$curr-group[count(. | key('groupBunDesc', concat(COL[8],COL[14],COL[10],COL[11]))[1]) = 1]"> <xsl:variable name="child-group" select="key('groupBunDesc', concat(COL[8],COL[14],COL[10],COL[11]))" /> <xsl:if test="COL[14] != ''"> <tr> <xsl:value-of select="COL[14]"/> </tr> <tr> <xsl:value-of select="COL[3]"/> </tr> <tr> <xsl:value-of select="sum($child-group/COL[4])"/> </tr> <tr> <xsl:value-of select="sum($child-group/COL[5])"/> </tr> <tr> <xsl:value-of select="sum($child-group/COL[6])"/> </tr> <tr> <xsl:value-of select="sum($child-group/COL[7])"/> </tr> </xsl:if> </xsl:for-each> </table> </xsl:for-each> </xsl:template> </xsl:stylesheet> 旁白:您所需的输出格式不正确,因为它缺少根并且标签似乎是 HTML 元素,但表行的 <tr> 标签未正确使用。

回答 1 投票 0

如何使用XSLT为XML文件创建不同大小的页面?

我有一个这种格式的大型 XML 文件: 我有一个这种格式的大型 XML 文件: <data jsxid="jsxroot" caseNumber="59878"> <record jsxid="1" poNumber="13-192208" manu="Biotronik" catNumber="101" total="0" /> <record jsxid="2" poNumber="13-192208" manu="Biotronik" catNumber="102" total="0" /> <record jsxid="3" poNumber="13-192208" manu="Biotronik Total" catNumber="" total="1" /> <record jsxid="4" poNumber="13-192211" manu="Biotronik" catNumber="103" total="0" /> <record jsxid="5" poNumber="13-192211" manu="Biotronik Total" catNumber="" total="1"/> 我想将其分页为 25 或更少的组,并且每页必须以总行结束 (@total="1")。 我使用以下 XSL 插入静态页码,但有时会在 poNumber 组的中间被切断,因此总数位于下一页上: <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:param name="pagesize" select="25" /> <xsl:template match="data"> <data> <xsl:for-each select="@*"> <xsl:copy-of select="." /> </xsl:for-each> <xsl:apply-templates mode="page" select="record[position() mod $pagesize = 1]" /> </data> </xsl:template> <xsl:template match="record" mode="page"> <record jsxid="{position()}" > <xsl:apply-templates select=". | following-sibling::record[position() &lt; $pagesize]" /> </record> </xsl:template> <xsl:template match="record"> <xsl:copy-of select="." /> </xsl:template> 关于如何确保每页上的最后一条记录是总计,有什么想法吗? 编辑:我只是想澄清我对发布的样式表做了什么。 它为每 ($pagesize) 条记录插入一个页面 (jsxid = n) 的占位符。 因此,如果与我发布的数据集类似的 pagesize = 5,则输出为: <data jsxid="jsxroot" caseNumber="59878"> <record jsxid="1"> <record jsxid="1" poNumber="13-192208" manufacturer="Biotronik" catalogNumber="101" total="0" /> <record jsxid="2" poNumber="13-192208" manufacturer="Biotronik" catalogNumber="102" total="0" /> <record jsxid="3" poNumber="13-192208" manufacturer="Biotronik Total" catalogNumber="" total="1" /> <record jsxid="4" poNumber="13-192211" manufacturer="Biotronik" catalogNumber="103" total="0" /> <record jsxid="5" poNumber="13-192211" manufacturer="Biotronik Total" catalogNumber="" total="1"/> <record jsxid="2"> <record jsxid="6" poNumber="13-192208" manufacturer="Biotronik" catalogNumber="101" total="0" /> <record jsxid="7" poNumber="13-192208" manufacturer="Biotronik" catalogNumber="102" total="0" /> 我在通用界面中以矩阵形式显示这些数据,并使用 jsxid 在“页面”之间进行迭代。 谢谢。 我使用以下方法插入静态页码 XSL 我在您发布的样式表中没有看到这一点。假设分页是指为每条记录分配页码,请尝试: XSLT 1.0 <?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:param name="pagesize" select="25" /> <xsl:key name="record" match="record" use="@poNumber" /> <xsl:template match="/data"> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="record[@total=1]"/> <xsl:with-param name="page" select="1"/> <xsl:with-param name="existing-lines" select="0"/> </xsl:call-template> </xsl:copy> </xsl:template> <xsl:template name="paginate"> <xsl:param name="orders" /> <xsl:param name="page"/> <xsl:param name="existing-lines"/> <xsl:param name="current-order-records" select="key('record', $orders[1]/@poNumber)"/> <xsl:param name="added-lines" select="count($current-order-records)"/> <xsl:choose> <xsl:when test="$existing-lines + $added-lines > $pagesize"> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="$orders"/> <xsl:with-param name="page" select="$page + 1"/> <xsl:with-param name="existing-lines" select="0"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:for-each select="$current-order-records"> <record page="{$page}"> <xsl:copy-of select="@*"/> </record> </xsl:for-each> <xsl:if test="count($orders) > 1"> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="$orders[position() > 1]"/> <xsl:with-param name="page" select="$page"/> <xsl:with-param name="existing-lines" select="$existing-lines + $added-lines "/> </xsl:call-template> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 您的输入太小,无法对此进行测试,因此...请注意,如果任何 poNumber 的记录超过 25 条,这将会崩溃。 编辑: 为每个页面创建一个容器元素要困难得多:需要进行预处理。尝试: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:param name="pagesize" select="25" /> <xsl:key name="record" match="record" use="@poNumber" /> <xsl:variable name="root" select="/" /> <xsl:template match="/data"> <!-- first-pass --> <xsl:variable name="index"> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="record[@total=1]"/> <xsl:with-param name="page" select="1"/> <xsl:with-param name="existing-lines" select="0"/> </xsl:call-template> </xsl:variable> <xsl:variable name="index-entry" select="exsl:node-set($index)/entry" /> <!-- output --> <xsl:copy> <xsl:copy-of select="@*" /> <xsl:for-each select="$index-entry[@page-start='true']"> <record jsxid="{@page}"> <xsl:variable name="poNumbers" select="$index-entry[@page=current()/@page]/@poNumber" /> <xsl:for-each select="$root"> <xsl:copy-of select="key('record', $poNumbers)"/> </xsl:for-each> </record> </xsl:for-each> </xsl:copy> </xsl:template> <xsl:template name="paginate"> <xsl:param name="orders" /> <xsl:param name="page"/> <xsl:param name="existing-lines"/> <xsl:param name="current-order-records" select="key('record', $orders[1]/@poNumber)"/> <xsl:param name="added-lines" select="count($current-order-records)"/> <xsl:choose> <xsl:when test="$existing-lines + $added-lines > $pagesize"> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="$orders"/> <xsl:with-param name="page" select="$page + 1"/> <xsl:with-param name="existing-lines" select="0"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <entry page="{$page}" page-start="{$existing-lines = 0}"> <xsl:copy-of select="$orders[1]/@*"/> </entry> <xsl:if test="count($orders) > 1"> <xsl:call-template name="paginate"> <xsl:with-param name="orders" select="$orders[position() > 1]"/> <xsl:with-param name="page" select="$page"/> <xsl:with-param name="existing-lines" select="$existing-lines + $added-lines "/> </xsl:call-template> </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> 编辑2: 要计算最大 PO 所需的最小页面大小,请将其添加到样式表的顶层(任何模板之外): <xsl:variable name="largestPO"> <xsl:for-each select="/data/record[@total = 1]"> <xsl:sort select="count(key('record', @poNumber))" data-type="number" order="descending"/> <xsl:if test="position()=1"> <xsl:value-of select="count(key('record', @poNumber))" /> </xsl:if> </xsl:for-each> </xsl:variable> 现在您只需将其与默认页面大小进行比较,然后选择两者中较大的一个即可。

回答 1 投票 0

XSLT:应用 xml 转换,然后进行另一个文本转换

尽管有多个线程解释了在同一 xslt 文件中使用多个模板,但我找不到解决我的问题的解决方案。 我想对我的......应用两个转换

回答 1 投票 0

XSLT:根据条件求和并删除xml节点

我目前正在进行一项棘手的转换,其中我需要在文章出现两次时对游戏文章的价格值进行求和,并从输出中排除第二篇文章。

回答 1 投票 0

如果不同节点中的关键字段是公共的,如何连接不同节点中的 XML 字段?

我的源 xml 文件具有以下形式的元素: ABC 德里 ABC 我的源 xml 文件具有以下形式的元素: <Employees> <Employee> <Name>ABC</Name> <City>Delhi</Delhi> </Employee> <Employee> <Name>ABC</Name> <City>Mumbai</Delhi> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</Delhi> </Employee> </Employees> 我使用了以下 XSLT 代码 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/root"> <Employees> <xsl:for-each-group select="row" group-starting-with="row[Name/text()]"> <Employee> <FIELD7> <xsl:value-of select="City" separator="|"/> </FIELD7> </Employee> </xsl:for-each-group> </Employees> </xsl:template> </xsl:stylesheet> 在这里,如果员工的姓名相同,那么 XSLT 会将城市与管道连接起来。我的预期输出。 <Employees> <Employee> <Name>ABC</Name> <City>Delhi|Mumbai</Delhi> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</Delhi> </Employee> </Employees> 您已将问题标记为 XSLT 1.0,但在尝试中您使用了 XSLT 2/3 for-each-group,因此假设您使用的是 XSLT 3 处理器,例如当前版本的 Saxon Java、Saxon JS 或 SaxonC 或 SaxonCS 或 .NET,您会需要这样的代码 <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:mode on-no-match="shallow-copy"/> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/Employees"> <xsl:copy> <xsl:for-each-group select="Employee" group-by="Name"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:for-each-group> </xsl:copy> </xsl:template> <xsl:template match="Employee/City"> <xsl:copy> <xsl:value-of select="current-group()/City" separator="|"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 在线小提琴使用 Saxon 12 HE。

回答 1 投票 0

XSLT 为输入 XML 中的每个增量分隔符位置分配变量

对于输入 XML: +本地_职能+小组_职能+小组_所有者+小组_经理+小组_领导+临时_服务 对于输入 XML: <EmpJob> <EmpJob> <ConcatDepartment>+Local_Functions+Group_Functions+Group_Owners+Group_Managers+Group_Leads+Interim_Services</ConcatDepartment> </EmpJob> </EmpJob> 我希望将值分配给 XSLT 中的变量,如下所示。分隔符是 +,它应该在将值分配给 XSLT 中的每个部门变量时递增,以便我可以使用它们获得以下预期输出.. <xsl:value-of select="$departments[1]" /> should return the string "" <xsl:value-of select="$departments[2]" /> should return the string "Local_Functions" <xsl:value-of select="$departments[3]" /> should return the string "Local_Functions/Group_Functions" <xsl:value-of select="$departments[4]" /> should return the string "Local_Functions/Group_Functions/Group_Owners" <xsl:value-of select="$departments[5]" /> should return the string "Local_Functions/Group_Functions/Group_Owners/Group_Managers" <xsl:value-of select="$departments[6]" /> should return the string "Local_Functions/Group_Functions/Group_Owners/Group_Managers/Group_Leads" <xsl:value-of select="$departments[7]" /> should return the string "Local_Functions/Group_Functions/Group_Owners/Group_Managers/Group_Leads/Interim_Services" <xsl:value-of select="$departments[8]" /> should return the string "" <xsl:value-of select="$departments[9]" /> should return the string "" <xsl:value-of select="$departments[10]" /> should return the string "" 我尝试过 <xsl:variable name="departments" select="tokenize(/EmpJob/EmpJob/ConcatDepartment, '\+')"/> <xsl:value-of select="$departments[1]" /> 返回字符串“” <xsl:value-of select="$departments[2]" /> 返回字符串“Local_Functions” <xsl:value-of select="$departments[3]" /> 返回字符串“Group_Functions” <xsl:value-of select="$departments[4]" /> 返回字符串“Group_Owners”等等...XSLT 的任何帮助都将非常有帮助 要获得您想要的行为,请使用如下表达式: <xsl:value-of select="$departments[position() le 4]" separator="/"/> 返回字符串: /Local_Functions/Group_Functions/Group_Owners 注意表达式: <xsl:value-of select="$departments[position() le 10]" separator="/"/> 将返回: /Local_Functions/Group_Functions/Group_Owners/Group_Managers/Group_Leads/Interim_Services 而不是空字符串。我不确定应该使用什么逻辑来产生您显示的确切结果。

回答 1 投票 0

XSLT 为输入 XML 中的每个分隔符位置分配变量

在我的 XSLT 中,我需要将值分配给名为 FODepartment_LX 的变量,其中 X 表示从最左侧分隔符开始的分隔符 (+) 的位置,最大位置为 10。如果...

回答 1 投票 0

XSLT 2.0 转换:按值和元素对节点进行分组

尝试转换 xml 并按 xslt 2.0 中的值和元素对节点进行分组 我有一个输入 xml 如下: ...

回答 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 从 XML 复制依赖数据

我面临着从 xml 进行 xslt 转换的问题。 xml:节点“”在xml中重复12次,并提取依赖的业务对象

回答 1 投票 0

2.0 版本的 XSLT 分组

想知道如何在 XSLT 中创建多个分组。以下 XML 应按 memberID、存款日期和存款类型分组。每个成员的总金额应为

回答 1 投票 0

XSLT 多重分组

想知道如何在 XSLT 中创建多个分组。以下 XML 应按 memberID、存款日期和存款类型分组。每个成员的总金额应为

回答 1 投票 0

需要帮助使用 xslt 列出数组中的值

需要帮助使用 xslt 列出数组中的值。目前,它们显示为一行一行,需要值才能在数组中显示它们。 附件是源 xml 和 xslt 尝试过但不确定...

回答 1 投票 0

仅将系列中的某些项目分组章节标题

我有一个 XML 文档,其中包含一系列段落: 章节标题 ... 我有一个包含一系列段落的 XML 文档: <section> <title>Section title</title> <p style="Body">...</p> <p style="Body">...</p> <p style="Note">...</p> <p style="Body">...</p> <p style="Body">...</p> <p style="Warning">...</p> <p style="Warning">...</p> <p style="Warning">...</p> <p style="Body">...</p> <p style="Note">...</p> <p style="Warning">...</p> <p style="Body">...</p> </section> 我想将 3 个相邻的警告段落分组(这样我就可以将格式应用于整个组,例如将它们放在 div 内,这样我就可以在它们周围放置边框)。必须保留元素的顺序。 <section> <title>Section title</title> <p style="Body">...</p> <p style="Body">...</p> <p style="Note">...</p> <p style="Body">...</p> <p style="Body">...</p> <div> <p style="Warning">...</p> <p style="Warning">...</p> <p style="Warning">...</p> </div> <p style="Body">...</p> <p style="Note">...</p> <p style="Warning">...</p> <p style="Body">...</p> </section> 我在使用 for-each-group 指令时遇到问题: <xsl:for-each-group select="*" group-adjacent="@stylename"> (wrap in div here) 这给了我一个错误,因为标题元素没有 @stylename 属性。 我不能这样做 for-each-group select="p" 因为这样标题元素根本就没有被处理。 如何处理该部分中的所有元素,但仅按段落的 @stylename 进行分组? 您遇到什么错误?如果您只想将 p 分组到 style="warning" 中,为什么不将其放在 group-adjacent 中? 示例: <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" expand-text="yes"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:mode on-no-match="shallow-copy"/> <xsl:template match="section"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:for-each-group select="*" group-adjacent="@style='Warning'"> <xsl:choose> <xsl:when test="@style='Warning' and count(current-group()) > 1"> <div> <xsl:apply-templates select="current-group()"/> </div> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="current-group()"/> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

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

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

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

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

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

回答 1 投票 0

如果来自另一个节点的规则适用,则添加位置编号,但按照当前节点的顺序

输入: B缺乏 输入: <ROOT> <TEMPLATE style="test"> <ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT></VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="test"> <ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE> <ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT></VALUE></ATTRIBUTE> <ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="something-else"> <ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="footnotes"> <ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE> <ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE> <ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE> </TEMPLATE> <ROOT> 所需输出: <ROOT> <TEMPLATE style="test"> <ATTRIBUTE name="Color"><VALUE><UNIT>B</UNIT><UNIT>lack</UNIT> *1</VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="test"> <ATTRIBUTE name="Something"><VALUE>1235</VALUE></ATTRIBUTE> <ATTRIBUTE name="Name"><VALUE><UNIT>Hello</UNIT> *2</VALUE></ATTRIBUTE> <ATTRIBUTE name="Height"><VALUE>12</VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="something-else"> <ATTRIBUTE name="Test"><VALUE>Hey</VALUE></ATTRIBUTE> </TEMPLATE> <TEMPLATE style="footnotes"> <ATTRIBUTE name="FOOTNOTE_Test"><VALUE>not-relevant</VALUE></ATTRIBUTE> <ATTRIBUTE name="FOOTNOTE_Name"><VALUE>whatever</VALUE></ATTRIBUTE> <ATTRIBUTE name="FOOTNOTE_Color"><VALUE>Some value</VALUE></ATTRIBUTE> </TEMPLATE> <ROOT> 在我的样式为“test”的模板中,有些属性的名称+前缀“FOOTNOTE_”可以与模板“footnotes”中的属性名称匹配。如果名称匹配,则应将 " * {position}" 添加到属性值中。该位置计算已设置的脚注数量,但顺序基于测试样式属性而不是脚注。 我已经尝试过各种分组尝试和 for-each 循环,但它们从未达到预期的结果。 我正在使用 XSLT 2.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:key name="fn" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name, 'FOOTNOTE_')" /> <xsl:template match="/"> <xsl:variable name="temp"> <xsl:apply-templates mode="temp"/> </xsl:variable> <xsl:apply-templates select="$temp/ROOT"/> </xsl:template> <!-- identity transform --> <xsl:template match="@*|node()" mode="#all"> <xsl:copy> <xsl:apply-templates select="@*|node()" mode="#current"/> </xsl:copy> </xsl:template> <xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE[key('fn', @name)]/VALUE" mode="temp"> <xsl:copy> <xsl:apply-templates/> <NUMBER/> </xsl:copy> </xsl:template> <xsl:template match="NUMBER"> <xsl:text> *</xsl:text> <xsl:number count="NUMBER" level="any"/> </xsl:template> </xsl:stylesheet> 请注意,结果是混合内容的 XML,这是您通常想要避免的。 试试这个: <?xml version="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:key name="footnote" match="TEMPLATE[@style='footnotes']/ATTRIBUTE" use="substring-after(@name,'FOOTNOTE_')"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="TEMPLATE[@style='test']/ATTRIBUTE/VALUE"> <xsl:variable name="name" select="parent::*/@name"/> <xsl:copy> <xsl:apply-templates select="@* | node()"/> <xsl:variable name="footnode" as="element()?" select="key('footnote',$name)"/> <xsl:if test="$footnode"> <xsl:value-of select="concat(' *',(count(parent::*/preceding-sibling::*) + 1))"/> </xsl:if> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 2 投票 0

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