xslt-2.0 相关问题

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

查找通过 XML 中标记的内容文本识别元素的元素的计数

我正在尝试查找父元素的位置或计数;当我们可以在包含文本的帮助下识别它的子元素时;下面是 xml: ...

回答 1 投票 0

比较文件与键/ID节点并生成输出(包括来自两个文件的节点)如果差异在兄弟节点但是

我想比较 XML 节点(Key/ID 节点),他们看看他们的兄弟节点是否有任何不同的值,然后在输出中获取。 合并两个 XML 文件的输入 XML 我想比较 XML 节点(Key/ID 节点),他们看看他们的兄弟节点是否有任何不同的值,然后在输出中获取。 合并两个 XML 文件的输入 XML <?xml version="1.0" encoding="utf-8"?> <aggregatedData> <wd:Report_Data xmlns:wd="urn:report"> <wd:test> <wd:CID>0011</wd:CID> <wd:name>Test10</wd:name> <wd:tag>TAG2 </wd:tag> </wd:test> <wd:test> <wd:CID>20012</wd:CID> <wd:name>Test12</wd:name> <wd:tag>TAG2 </wd:tag> </wd:test> <wd:test> <wd:CID>0014</wd:CID> <wd:name>Test14</wd:name> <wd:tag> TAG3</wd:tag> </wd:test> </wd:Report_Data> <File xmlns="urn:ExternalSource"> <Root1> <CID>0011</CID> <curre>INR</curre> <name>Test1200</name> </Root1> <Root1> <CID>0000</CID> <curre>cnd</curre> <name>Test00</name> </Root1> <Root1> <CID>20012</CID> <curre>INR</curre> <name>Test12</name> </Root1> <Root1> <CID>0010</CID> <curre>INR</curre> <name>why10</name> </Root1> </File> </aggregatedData> 现在在上面的输入文件中,如果比较节点只有“0011”和“20012”是常见的,但兄弟只在“0011”中不同。 对于 20012(File/Root1/CID 和 wd:Report_Data/wd:test/wd:CID),两个地方的子节点值相同。它不应该被采摘。 对于 0011(File/Root1/CID 和 wd:Report_Data/wd:test/wd:CID),subling 节点值在两个地方都不同,因此下面将是输出以及 来自输入文件第一部分的一些节点. <?xml version="1.0" encoding="utf-8"?> <FinalFile> <Root1> <CID>0011</CID> <curre>INR</curre> <tag>TAG2</tag> <!-- Comment - this is from first section in input file--> </Root1> <FinalFile> 尝试使用 XSLT2.0 和 30 使用 xsl:accumulator 但没有运气。 请任何人在这里帮助我。谢谢!

回答 0 投票 0

比较文件与键/ ID节点,如果差异在兄弟节点中则生成输出

我想比较 XML 节点(Key/ID 节点),他们看看他们的兄弟节点是否有任何不同的值,然后在输出中获取。 合并两个 XML 文件的输入 XML 我想比较 XML 节点(Key/ID 节点),他们看看他们的兄弟节点是否有任何不同的值,然后在输出中获取。 合并两个 XML 文件的输入 XML <?xml version="1.0" encoding="utf-8"?> <aggregatedData> **<wd:Report_Data xmlns:wd="urn:report"> <wd:test> <wd:CID>0011</wd:CID> <wd:name>Test10</wd:name> </wd:test> <wd:test> <wd:CID>20012</wd:CID> <wd:name>Test12</wd:name> </wd:test> <wd:test> <wd:CID>0014</wd:CID> <wd:name>Test14</wd:name> </wd:test> </wd:Report_Data>** * <File xmlns="urn:ExternalSource"> <Root1> <CID>0011</CID> <curre>INR</curre> <name>Test1200</name> </Root1> <Root1> <CID>0000</CID> <curre>cnd</curre> <name>Test00</name> </Root1> <Root1> <CID>20012</CID> <curre>INR</curre> <name>Test12</name> </Root1> <Root1> <CID>0010</CID> <curre>INR</curre> <name>why10</name> </Root1> </File>* </aggregatedData> 现在在上面的输入文件中,如果比较节点只有“0011”和“20012”是常见的,但兄弟只在“0011”中不同。 对于 20012(File/Root1/CID 和 wd:Report_Data/wd:test/wd:CID),两个地方的子节点值相同。它不应该被采摘。 对于 0011(File/Root1/CID 和 wd:Report_Data/wd:test/wd:CID),subling 节点值在两个地方都不同,因此下面是输出。 <?xml version="1.0" encoding="utf-8"?> <FinalFile> <Root1> <CID>0011</CID> <curre>INR</curre> <name>Test1200</name> </Root1> <FinalFile> 尝试使用 XSLT2.0 和 30 使用 xsl:accumulator 但没有运气。 请任何人在这里帮助我。谢谢!

回答 0 投票 0

在 XSLT 中,我们如何添加 if 条件来检查对象的属性是否具有点 (.) 值 [重复]

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。 示例:当 Students.id 包含点 (.) 值时。那么它将需要Master Id。我们如何...

回答 0 投票 0

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。请有人帮助我

在 XSLT 中,我们如何添加 if 条件来检查对象的该属性是否具有点 (.) 值。请有人帮助我。 示例 - 当 Students.id 包含点 (.) 值时。 ...

回答 0 投票 0

使用XSLT复制XML中的所有节点,同时转换具有特定兄弟值的节点

我有一个 xml 文件,除了 1 个具有我需要转换的特定值的节点外,我主要需要 1 个复制 1 个。我的 XML 如下所示: 我有一个 xml 文件,除了需要转换的具有特定值的 1 个节点外,我主要需要 1 个复制 1 个。我的 XML 看起来像这样: <?xml version='1.0' encoding='UTF-8'?> <xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ 12 34 56 Z</xyz:ID> <xyz:IdType>A Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:IdType>B Type</xyz:IdType> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers> 我需要获取加载到节点xyz:ID中的值 <xyz:ID>MJ 12 34 56 Z</xyz:ID> 然后去掉空白,看起来像这样: <xyz:ID>MJ123456Z</xyz:ID> 但只有当他们的兄弟节点是xyz:IdType = A Type <xyz:IdType>A Type</xyz:IdType> 这是我试过的 XSLT。我引用了这个堆栈溢出(Using XSLT to copy all nodes in XML, with support for special cases)但是在处理它之后,我不确定这是否是正确的方法。 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:this="urn:this-stylesheet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xyz="urn:com.website/xyz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="xs this"> <!--Identity template, provides default behavior that copies all content into the output --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <xsl:template match="xyz:ID"> <xsl:copy> <xsl:value-of select="translate(node(), ' ', '')"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 这个 XSLT 给我以下输出: <?xml version="1.0" encoding="UTF-8"?><xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ123456Z</xyz:ID> <xyz:IdType>A Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:IdType>B Type</xyz:IdType> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers> 这接近于所需的输出,因为它确实从所需的 ID 中去除了空白: <xyz:ID>MJ123456Z</xyz:ID> 但是,在 C 类型标识符上,它正在删除标签中加载的数据: 改造前: <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> 改造后: <xyz:ID>123-45-6789</xyz:ID> <xyz:IdType>C Type</xyz:IdType> 这是一个问题,因为我希望文件的其余部分相同,除了 ID 的同级 ID 类型 = A 类型。 我相信这与将自身应用于所有 ID 节点的模板匹配有关。我试着按照这个逻辑做一些事情: <xsl:template match="xyz:Identifier[xyz:IdType='A Type']"> 但是没有运气。任何关于从哪里开始或我应该使用哪种逻辑的线索都将受到高度赞赏。 但只有当他们的兄弟节点是xyz:ID_Type = A Type 为此,您可以在 xyz:Identifier 上使用谓词。请注意,尽管您说的是xyz:ID_Type,但示例中有xyz:IdType. 我也只是匹配text()所以你不必复制或应用模板到xyz:ID的属性。 尝试将您的最后一个模板更改为(如果您的实际数据需要,将 IdType 更改为 ID_Type): <xsl:template match="xyz:Identifier[xyz:IdType='A Type']/xyz:ID/text()"> <xsl:value-of select="translate(., ' ', '')"/> </xsl:template> 小提琴:http://xsltfiddle.liberty-development.net/nbUWwbs 请尝试以下 XSLT。 看来你的 XML 样本应该有而不是: <xyz:IdType>A Type</xyz:IdType> 以下内容: <xyz:ID_Type>A Type</xyz:ID_Type> XSLT <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xyz="urn:com.website/xyz"> <xsl:output method="xml" indent="yes" encoding="utf-8" omit-xml-declaration="no"/> <xsl:strip-space elements="*"/> <!--Identity Transform pattern--> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="xyz:ID[following-sibling::xyz:ID_Type='A Type']"> <xsl:copy> <xsl:value-of select="translate(., ' ', '')"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 输出 <?xml version='1.0' encoding='utf-8' ?> <xyz:Workers xmlns:xyz="urn:com.website/xyz"> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isAdded="1"> <xyz:Identifier> <xyz:ID>MJ123456Z</xyz:ID> <xyz:ID_Type>A Type</xyz:ID_Type> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> <xyz:Worker> <xyz:Effective_Change xyz:Sequence="0"> <xyz:Person_Identification xyz:isUpdated="1"> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID>JHQ123</xyz:ID> <xyz:ID_Type>B Type</xyz:ID_Type> </xyz:Identifier> <xyz:Identifier xyz:isUpdated="1"> <xyz:ID xyz:priorValue="555-55-5555">123-45-6789</xyz:ID> <xyz:ID_Type>C Type</xyz:ID_Type> </xyz:Identifier> </xyz:Person_Identification> </xyz:Effective_Change> </xyz:Worker> </xyz:Workers>

回答 2 投票 0

如何在终止处理之前打印 XSLT 2.0 中所有缺失的属性?

我正在开发一个 DITA-OT 插件,我有一个 XSLT 模板,如果任何主题元素不包含 @appname 属性,我需要在其中终止处理。虽然这种方法效果很好,但它...

回答 0 投票 0

当有多个链接标签时获取具有特定rel的链接标签的xsl value-of href属性

我有一个 xml 文件,它有多个名为 tag1 的标签,每个条目标签都有多个链接标签,我需要链接标签的 href,其 rel="x" 1...

回答 0 投票 0

HTML 特殊字符代码在文本 XSLT 2.0 中的翻译

我从源系统收到文本中间有 HTML 特殊转义字符的文本。现在我需要将其转换为 XSLT 2.0 中的实际字符 我/我喜欢 Lenevo100 f&uum...

回答 0 投票 0

Xpath 用于查找存在于两个不同自闭合标签中的元素

我正确的 XML 是: XXX .. .. AAA &...

回答 2 投票 0

如果页脚被标记为多个 fo:marker 类但具有不同的检索边界值,将调用哪个检索类名

如果页脚被标记为多个 fo:marker 类并且所有 3 个类都在 fo:flow flow-name="xsl-region... 中实现,我需要了解将调用哪个 retrieve-class-name

回答 0 投票 0

XSLT:如何在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。在下面的示例中,我的预期结果是 2 [关闭]

本页给出Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm 即 本页给出Student.xml https://www.tutorialspoint.com/xslt/xslt_choose.htm即 <?xml version = "1.0"?> <?xml-stylesheet type = "text/xsl" href = "students.xsl"?> <class> <student rollno = "393"> <firstname>Dinkar</firstname> <lastname>Kad</lastname> <nickname>Dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>Vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>Jasvir</firstname> <lastname>Singh</lastname> <nickname>Jazz</nickname> <marks>90</marks> </student> </class> 如何使用 XSLT 在下面给定的 XML 中读取 Roll no = 493 的行位置。假设卷号是唯一的。在这个例子中,我的预期结果是 2

回答 0 投票 0

fo:retrieve-marker fo:marker marker-class-name Parent Child

我是这个 XSLT 的新手;下面是我正在寻找澄清的代码快照: 我是这个 XSLT 的新手;下面是我正在寻找澄清的代码快照: <fo:layout-master-set> <fo:simple-page-master master-name="second-page" page-width="210mm" page-height="297mm" margin-top="10mm" margin-bottom="10.5mm" margin-left="18mm" margin-right="18mm"> <fo:region-body margin-top="10mm" margin-bottom="75mm"/> <fo:region-before extent="3mm" region-name="second-page-header"/> <fo:region-after extent="75mm" region-name="second-page-footer"/> </fo:simple-page-master> <fo:page-sequence-master master-name="pageOneSequence"> <fo:single-page-master-reference master-reference="second-page"/> </fo:page-sequence-master> </fo:layout-master-set> <fo:page-sequence master-reference="pageOneSequence"> <fo:static-content flow-name="second-page-footer" font-family="normal" font-style="normal" font-size="4"> <fo:retrieve-marker retrieve-class-name="continued" retrieve-position="last-starting-within-page" retrieve-boundary="page"/> <fo:block-container position="absolute" top="20mm"> <fo:block/> </fo:block-container> </fo:static-content> <fo:static-content flow-name="second-page-header" font-family="normal" font-style="normal" font-weight="normal"> <xsl:if test="$Test = 0"> <xsl:call-template name="Test"/> </xsl:if> </fo:static-content> <fo:flow flow-name="xsl-region-body" font-size="8pt" font-family="normal" font-style="normal" font-weight="normal"> <fo:marker marker-class-name="continued"> <fo:block/> </fo:marker> </fo:page-sequence> 在second-page-footer我们有fo:retrieve-marker retrieve-class-name="continued"在xsl-region-body我们有fo:marker marker-class-name="continued" “ 这里谁是父母谁是孩子 w.r.t fo:marker 概念?

回答 0 投票 0

多个 fo:retrieve-marker 同名

两个页脚具有相同的 fo:retrieve-marker、retrieve-class-name 和 retrieve-boundary,如果我用 fo:mar 调用标记类名称,现在唯一不同的是检索位置。 .

回答 0 投票 0

fo:marker和fo:retrieve-marker的解释和Parent Child Relation关系

我是 XSLT 的新手,下面是代码快照,我试图从中了解 FOP 引擎将根据要决定的页面区域解释什么;谁是父母谁将是

回答 0 投票 0

需要识别重复的 Xpath 值,然后只打印一次

我的 XML 输出如下所示: 吉姆 1 ...

回答 1 投票 0

XSLT 映射以在同一序列中添加缺失的子标签

我有下面的输入 xml,其中缺少一些强制性 xml 标签,例如 需要以相同的顺序在输出中重现 我有下面的输入 xml,其中缺少一些强制性的 xml 标签,例如 需要以相同的顺序在输出中重现 <?xml version="1.0" encoding="UTF-8"?> <rsp stat="ok" version="1.0"> <result> <total_results>700</total_results> <emailClick> <id>1</id> <url>https://www.google.com</url> <email_template_id>12</email_template_id> <created_at>2023-02-14 00:00:10</created_at> </emailClick> <emailClick> <id>2</id> <url>https://www.hello.com</url> <created_at>2023-02-14 00:00:10</created_at> </emailClick> </result> </rsp> 需要以下输出 <emailClick> <id>1</id> <url>https://www.google.com</url> <email_template_id>12</email_template_id> <created_at>2023-02-14 00:00:10</created_at> </emailClick> <emailClick> <id>2</id> <url>https://www.hello.com</url> <email_template_id/> <created_at>2023-02-14 00:00:10</created_at> </emailClick> 我正在使用下面的 xslt 来实现这个输出 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent ="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:for-each select="rsp/result/emailClick"> <emailClick> <id><xsl:value-of select="id" /></id> <url><xsl:value-of select="url" /></url> <email_template_id><xsl:value-of select="email_template_id"/></email_template_id> <created_at><xsl:value-of select="created_at"/></created_at> </emailClick> </xsl:for-each> </xsl:template> </xsl:stylesheet> 有没有更好的方法来实现这一点,任何指导将不胜感激

回答 0 投票 0

给定预期输出,给我合适的

可以从此位置访问 XML 文件和报告。只需检索它们即可进行进一步的分析或处理。 可以从此位置访问 XML 文件和报告。只需检索它们即可进行进一步的分析或处理。 <?xml version='1.0' encoding='UTF-8'?><wd:Report_Data xmlns:wd="urn:com.workday.report/AS-Job"> <wd:Report_Entry><wd:Employee_ID>21001</wd:Employee_ID><wd:Employee_Name wd:Descriptor="Logan McNeil"><wd:ID wd:type="WID">e5bc2ab66e12108afc0ea6bd21e18eb5</wd:ID></wd:Employee_Name><wd:businessTitle>manager</wd:businessTitle><wd:Pay_Group wd:Descriptor="USA Monthly"><wd:ID wd:type="WID">a6a3d98667254c5792bab31405b12abf</wd:ID><wd:ID wd:type="Organization_Reference_ID">USA_Monthly</wd:ID></wd:Pay_Group><wd:Supervisory_Organization wd:Descriptor="Human Resources"><wd:ID wd:type="WID">e02485f863ec48d39a082bb95cc4abe4</wd:ID><wd:ID wd:type="Organization_Reference_ID">SUPERVISORY_Human_Resources</wd:ID></wd:Supervisory_Organization><wd:User_Name>lmcneil</wd:User_Name><wd:Primary_Address_-_Formatted_Line_1>42 Laurel Street</wd:Primary_Address_-_Formatted_Line_1><wd:city>San%20Francisco</wd:city><wd:Primary_Address_-_Country_Name>California</wd:Primary_Address_-_Country_Name><wd:Primary_Address_-_Postal_Code>94118</wd:Primary_Address_-_Postal_Code></wd:Report_Entry><wd:Report_Entry> Expected Output:: Employee ID,Employee Name,Business Title,Pay Group,Supervisory Organization,Username,Address Line 1,Address Line 2,City,State,Postal Code,Location ADP ID 10001,"Logan, Mcneil","Corporate VP Paralegal","USA Monthly","Human Resources","lmcneil","42 Laurel Street","","Des Moines","Iowa",50047,"ADP PayForce.Location: SF1 -> San Francisco" 20220924,1 Trailer Row -> Today's Date and Count of workers send in output file. Selection Critera -> Country - USA, Regular, Full Time Schedule -> Everyday, 5 AM UTC

回答 0 投票 0

使用 xslt 为每个元素添加属性

我想为每个元素添加一个属性Permenant = yes: 我想给每一个Permenant = yes元素添加一个属性<File>: <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Fragment> <DirectoryRef Id="DATADIR"> <Directory Id="dir8EB85FD628E9C5D122F0BADE39DDAE35" Name="config" /> </DirectoryRef> </Fragment> <Fragment> <ComponentGroup Id="AssembliesDataDirGroup"> <Component Id="cmpCEE154EC3F8D0FF001948410061242D4" Directory="dir8EB85FD628E9C5D122F0BADE39DDAE35" Guid="*"> <File Id="filBAB615DC969ACFD243D566F889384EAB" KeyPath="yes" Source="$(var.SourceDirectory)\config\jj.options" /> </Component> <Component Id="cmp7D1A807E2DEC4CCE0C14E0A26500CED2" Directory="dir8EB85FD628E9C5D122F0BADE39DDAE35" Guid="*"> <File Id="filB963451E642F947E821629411CBBD719" KeyPath="yes" Source="$(var.SourceDirectory)\config\log4j2.properties" /> </Component> ... </ComponentGroup> </Fragment> </Wix> 我正在我的 xslt 中尝试以下操作: <xsl:template match="File"> <xsl:copy> <xsl:attribute name="Permenant"> <xsl:value-of select="yes"/> </xsl:attribute> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> 但没有任何效果。我怎样才能做到这一点?

回答 0 投票 0

重新排序表列

在另一个问题之后,我正在寻找一个更通用的解决方案来解决按自定义顺序重新排列表格列的问题。我找不到任何东西,所以我把我的贴在这里。 输入 XML 在another question之后,我正在寻找一个更通用的解决方案来解决按自定义顺序重新排列表格列的问题。我找不到任何东西,所以我把我的贴在这里。 输入 XML <table> <row> <cell>NAME</cell> <cell>DATE</cell> <cell>SIZE</cell> <cell>COLOR</cell> </row> <row> <cell>Alpha</cell> <cell>2023-02-19</cell> <cell>Small</cell> <cell>Red</cell> </row> <row> <cell>Bravo</cell> <cell>2023-02-19</cell> <cell>Small</cell> <cell>Green</cell> </row> <row> <cell>Charlie</cell> <cell>2023-02-19</cell> <cell>Small</cell> <cell>Blue</cell> </row> </table> 预期产出 <table border="1"> <tr> <th>DATE</th> <th>COLOR</th> <th>SIZE</th> <th>NAME</th> </tr> <tr> <td>2023-02-19</td> <td>Red</td> <td>Small</td> <td>Alpha</td> </tr> <tr> <td>2023-02-19</td> <td>Green</td> <td>Small</td> <td>Bravo</td> </tr> <tr> <td>2023-02-19</td> <td>Blue</td> <td>Small</td> <td>Charlie</td> </tr> </table> XSLT 1.0(具有 EXSLT node-set() 扩展功能) <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="new-order">DATE,COLOR,SIZE,NAME</xsl:param> <xsl:template match="/table"> <xsl:variable name="columns-RTF"> <xsl:call-template name="generate-columns"> <xsl:with-param name="headings" select="$new-order"/> <xsl:with-param name="top-row-cells" select="row[1]/cell"/> </xsl:call-template> </xsl:variable> <xsl:variable name="columns" select="exsl:node-set($columns-RTF)/column" /> <!-- output --> <table border="1"> <!-- header --> <tr> <xsl:for-each select="$columns"> <th> <xsl:value-of select="." /> </th> </xsl:for-each> </tr> <!-- data --> <xsl:for-each select="row[position() > 1]"> <tr> <xsl:variable name="cells" select="cell" /> <xsl:for-each select="$columns"> <td> <xsl:value-of select="$cells[position() = current()/@i]" /> </td> </xsl:for-each> </tr> </xsl:for-each> </table> </xsl:template> <xsl:template name="generate-columns"> <xsl:param name="headings"/> <xsl:param name="top-row-cells"/> <xsl:param name="delimiter" select="','"/> <xsl:variable name="token" select="substring-before(concat($headings, $delimiter), $delimiter)" /> <column i="{count($top-row-cells[. = $token]/preceding-sibling::cell) + 1}"> <xsl:value-of select="$token"/> </column> <xsl:if test="contains($headings, $delimiter)"> <!-- recursive call --> <xsl:call-template name="generate-columns"> <xsl:with-param name="headings" select="substring-after($headings, $delimiter)"/> <xsl:with-param name="top-row-cells" select="$top-row-cells"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet> 使用支持 tokenize() 扩展功能的处理器,这可以简化为: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:str="http://exslt.org/strings" extension-element-prefixes="exsl str"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:param name="new-order">DATE,COLOR,SIZE,NAME</xsl:param> <xsl:template match="/table"> <xsl:variable name="top-row-cells" select="row[1]/cell"/> <xsl:variable name="columns-RTF"> <xsl:for-each select="str:tokenize($new-order, ',')"> <column i="{count($top-row-cells[. = current()]/preceding-sibling::cell) + 1}"> <xsl:value-of select="."/> </column> </xsl:for-each> </xsl:variable> <xsl:variable name="columns" select="exsl:node-set($columns-RTF)/column" /> <!-- output --> <table border="1"> <!-- header --> <tr> <xsl:for-each select="$columns"> <th> <xsl:value-of select="." /> </th> </xsl:for-each> </tr> <!-- data --> <xsl:for-each select="row[position() > 1]"> <tr> <xsl:variable name="cells" select="cell" /> <xsl:for-each select="$columns"> <td> <xsl:value-of select="$cells[position() = current()/@i]" /> </td> </xsl:for-each> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

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