xslt-grouping 相关问题

分组特定于XSLT的机制。应始终使用xslt-1.0,xslt-2.0或xslt-3.0标记进行补充,以指示使用的版本。

XSLT代码将XML文件拆分为基于XML标签的运行时Mulitple XML文件 <events><id>

AM试图将XML文件分为基于XML标签 /输入XML文件中的多个XML文件。单个输出XML文件应按照输入XML /从输入XML的顶部到底部按顺序进行,XML标签具有唯一的ID。 所有输出单个XML文件应按照输入XML文件为顺序。

回答 0 投票 0

XSLT 将日期和时间从 PST 转换为 UTC

在我的 XSLT 中,我输出时间戳: 在我的 XSLT 中,我输出时间戳: <time_stamp> <xsl:value-of select="format-dateTime(wd:Last_Functionally_Updated, '[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]')"/> </time_stamp> 但是,源字段 是 PST,如何将其转换为 UTC? UTC 比 PST 早 8 小时,例如,太平洋标准时间下午 1 点是 UTC 晚上 9 点 下面是 XML <?xml version='1.0' encoding='UTF-8'?> <wd:Report_Data xmlns:wd="urn:com.workday.report/INT0194_Recruitics"> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000051703</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000076253</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:35.698-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:54.044-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:42:50.630-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:19.091-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:39.613-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Assessment"> <wd:ID wd:type="WID">bb01594c858710000e4d46d2b7220034</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">ASSESSMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:45:00.608-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:52:33.923-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer (Employment Agreement)"> <wd:ID wd:type="WID">1d57fbe8504d100015945d2b2704006a</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">EMPLOYMENT_AGREEMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Background Check"> <wd:ID wd:type="WID">be56571f9f6f45ca82871c8bec853f5e</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">BACKGROUND</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Ready for Hire"> <wd:ID wd:type="WID">edd55803e2ec49c3a6eb01daadfc9bf9</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">HIRED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721053</wd:candidate> <wd:Requisition_ID>R-0000106433</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:30.187-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer"> <wd:ID wd:type="WID">868a8156682541f2aadc2fe90268b75f</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">OFFER</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721051</wd:candidate> <wd:Requisition_ID>R-0000098017</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721062</wd:candidate> <wd:Requisition_ID>R-0000086280</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-17T22:12:11.799-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721063</wd:candidate> <wd:Requisition_ID>R-0000085728</wd:Requisition_ID> </wd:Report_Entry> </wd:Report_Data> 下面是我正在使用的 XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wd="urn:com.workday.report/INT0194_Recruitics" exclude-result-prefixes="wd"> <xsl:output method="text" omit-xml-declaration="no"/> <xsl:variable name="RECORD-DELIMITER"> <xsl:text>&#xd;&#xa;</xsl:text> </xsl:variable> <xsl:param name="Dilim">","</xsl:param> <xsl:param name="Quote">"</xsl:param> <xsl:param name="Comma">,</xsl:param> <xsl:variable name="FIELD-DELIMITER"> <xsl:value-of select="$Dilim"/> </xsl:variable> <xsl:variable name="STARTING-QUOTE"> <xsl:value-of select="$Quote"/> </xsl:variable> <xsl:template match="wd:Report_Data"> <Header> <HeaderItem1>"time_stamp"</HeaderItem1> <xsl:value-of select="$Comma"/> <HeaderItem2>"event"</HeaderItem2> <xsl:value-of select="$Comma"/> <HeaderItem3>"applyflow_id"</HeaderItem3> <xsl:value-of select="$Comma"/> <HeaderItem4>"job_id"</HeaderItem4> </Header> <xsl:value-of select="$RECORD-DELIMITER"/> <xsl:for-each-group select="wd:Report_Entry[wd:Job_Requisition_group/wd:Is_Evergreen = 0]/wd:Job_Application_Process_Statuses_group" composite="yes" group-by="../wd:candidate, ../wd:Requisition_ID, ../wd:Job_application_ID, wd:Stage/wd:ID"> <xsl:for-each select="(current-group() => sort((), function($j) { $j/wd:Last_Functionally_Updated }))[last()]"> <xsl:value-of select="$STARTING-QUOTE"/> <time_stamp> <xsl:value-of select="format-dateTime(wd:Last_Functionally_Updated, '[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]')"/> </time_stamp> <xsl:value-of select="$FIELD-DELIMITER"/> <event> <xsl:value-of select="wd:Stage/@wd:Descriptor"/> </event> <xsl:value-of select="$FIELD-DELIMITER"/> <applyflow_id> <xsl:value-of select="../wd:candidate"/> </applyflow_id> <xsl:value-of select="$FIELD-DELIMITER"/> <job_id> <xsl:value-of select="../wd:Requisition_ID"/> </job_id> <xsl:value-of select="$STARTING-QUOTE"/> <xsl:value-of select="$RECORD-DELIMITER"/> </xsl:for-each> </xsl:for-each-group> </xsl:template> </xsl:stylesheet> 我几乎使用 使其工作,但它实际上不起作用,因为在 XML 中,某些时间值具有 -07:00 (例如,2023-06-26T12:50:11.949-07:00)并且有些有 -08:00 (例如, 2024-02-29T13:26:32.874-08:00) 所以 PT1H 仅在 -07:00 时有效。也许我应该尝试使用子字符串来删除“-07:00”部分,但不知道如何操作。预先感谢。 要动态处理 XSLT 3.0 中从 PST 到 UTC 的转换,特别是当输入 XML 时间戳具有不同的偏移量(如 -07:00 或 -08:00)时,您可以组合使用 adjustment-dateTime-to-timezone()提取的时区与提供的日期时间的偏移量。 关键步骤是: 使用 substring() 或analyze-string() 从 wd:Last_Functionally_Updated 值中动态提取时区偏移量。 使用 adjustment-dateTime-to-timezone() 将时间戳标准化为 UTC。 以下是实施方法: 更新了 XSLT 代码 <xsl:template match="wd:Report_Data"> <xsl:for-each select="wd:Report_Entry/wd:Job_Application_Process_Statuses_group"> <xsl:variable name="raw-dateTime" select="wd:Last_Functionally_Updated" /> <!-- Adjust the dateTime to UTC --> <xsl:variable name="utc-dateTime" select="adjust-dateTime-to-timezone(xs:dateTime($raw-dateTime), xs:dayTimeDuration('PT0H'))" /> <time_stamp> <!-- Format the adjusted UTC dateTime --> <xsl:value-of select="format-dateTime($utc-dateTime, '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')" /> </time_stamp> </xsl:for-each> </xsl:template>

回答 1 投票 0

XSLT 将日期和时间从 PST 转换为 U

在我的 XSLT 中,我输出时间戳: 在我的 XSLT 中,我输出时间戳: <time_stamp> <xsl:value-of select="format-dateTime(wd:Last_Functionally_Updated, '[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]')"/> </time_stamp> 但是,源字段 是 PST,如何将其转换为 UTC? UTC 比 PST 早 8 小时,例如,太平洋标准时间下午 1 点是 UTC 晚上 9 点 下面是 XML <?xml version='1.0' encoding='UTF-8'?> <wd:Report_Data xmlns:wd="urn:com.workday.report/INT0194_Recruitics"> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000051703</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000076253</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:35.698-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:54.044-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:42:50.630-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:19.091-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:39.613-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Assessment"> <wd:ID wd:type="WID">bb01594c858710000e4d46d2b7220034</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">ASSESSMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:45:00.608-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:52:33.923-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer (Employment Agreement)"> <wd:ID wd:type="WID">1d57fbe8504d100015945d2b2704006a</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">EMPLOYMENT_AGREEMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Background Check"> <wd:ID wd:type="WID">be56571f9f6f45ca82871c8bec853f5e</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">BACKGROUND</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Ready for Hire"> <wd:ID wd:type="WID">edd55803e2ec49c3a6eb01daadfc9bf9</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">HIRED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721053</wd:candidate> <wd:Requisition_ID>R-0000106433</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:30.187-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer"> <wd:ID wd:type="WID">868a8156682541f2aadc2fe90268b75f</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">OFFER</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721051</wd:candidate> <wd:Requisition_ID>R-0000098017</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721062</wd:candidate> <wd:Requisition_ID>R-0000086280</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-17T22:12:11.799-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721063</wd:candidate> <wd:Requisition_ID>R-0000085728</wd:Requisition_ID> </wd:Report_Entry> </wd:Report_Data> 下面是我正在使用的 XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wd="urn:com.workday.report/INT0194_Recruitics" exclude-result-prefixes="wd"> <xsl:output method="text" omit-xml-declaration="no"/> <xsl:variable name="RECORD-DELIMITER"> <xsl:text>&#xd;&#xa;</xsl:text> </xsl:variable> <xsl:param name="Dilim">","</xsl:param> <xsl:param name="Quote">"</xsl:param> <xsl:param name="Comma">,</xsl:param> <xsl:variable name="FIELD-DELIMITER"> <xsl:value-of select="$Dilim"/> </xsl:variable> <xsl:variable name="STARTING-QUOTE"> <xsl:value-of select="$Quote"/> </xsl:variable> <xsl:template match="wd:Report_Data"> <Header> <HeaderItem1>"time_stamp"</HeaderItem1> <xsl:value-of select="$Comma"/> <HeaderItem2>"event"</HeaderItem2> <xsl:value-of select="$Comma"/> <HeaderItem3>"applyflow_id"</HeaderItem3> <xsl:value-of select="$Comma"/> <HeaderItem4>"job_id"</HeaderItem4> </Header> <xsl:value-of select="$RECORD-DELIMITER"/> <xsl:for-each-group select="wd:Report_Entry[wd:Job_Requisition_group/wd:Is_Evergreen = 0]/wd:Job_Application_Process_Statuses_group" composite="yes" group-by="../wd:candidate, ../wd:Requisition_ID, ../wd:Job_application_ID, wd:Stage/wd:ID"> <xsl:for-each select="(current-group() => sort((), function($j) { $j/wd:Last_Functionally_Updated }))[last()]"> <xsl:value-of select="$STARTING-QUOTE"/> <time_stamp> <xsl:value-of select="format-dateTime(wd:Last_Functionally_Updated, '[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]')"/> </time_stamp> <xsl:value-of select="$FIELD-DELIMITER"/> <event> <xsl:value-of select="wd:Stage/@wd:Descriptor"/> </event> <xsl:value-of select="$FIELD-DELIMITER"/> <applyflow_id> <xsl:value-of select="../wd:candidate"/> </applyflow_id> <xsl:value-of select="$FIELD-DELIMITER"/> <job_id> <xsl:value-of select="../wd:Requisition_ID"/> </job_id> <xsl:value-of select="$STARTING-QUOTE"/> <xsl:value-of select="$RECORD-DELIMITER"/> </xsl:for-each> </xsl:for-each-group> </xsl:template> </xsl:stylesheet> 我几乎使用 使其工作,但它实际上不起作用,因为在 XML 中,某些时间值具有 -07:00 (例如,2023-06-26T12:50:11.949-07:00)并且有些有 -08:00 (例如, 2024-02-29T13:26:32.874-08:00) 所以 PT1H 仅在 -07:00 时有效。也许我应该尝试使用子字符串来删除“-07:00”部分,但不知道如何操作。预先感谢。 要动态处理 XSLT 3.0 中从 PST 到 UTC 的转换,特别是当输入 XML 时间戳具有不同的偏移量(如 -07:00 或 -08:00)时,您可以组合使用 adjustment-dateTime-to-timezone()提取的时区与提供的日期时间的偏移量。 关键步骤是: 使用 substring() 或analyze-string() 从 wd:Last_Functionally_Updated 值中动态提取时区偏移量。 使用 adjustment-dateTime-to-timezone() 将时间戳标准化为 UTC。 以下是实施方法: 更新了 XSLT 代码 <xsl:template match="wd:Report_Data"> <xsl:for-each select="wd:Report_Entry/wd:Job_Application_Process_Statuses_group"> <xsl:variable name="raw-dateTime" select="wd:Last_Functionally_Updated" /> <!-- Adjust the dateTime to UTC --> <xsl:variable name="utc-dateTime" select="adjust-dateTime-to-timezone(xs:dateTime($raw-dateTime), xs:dayTimeDuration('PT0H'))" /> <time_stamp> <!-- Format the adjusted UTC dateTime --> <xsl:value-of select="format-dateTime($utc-dateTime, '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')" /> </time_stamp> </xsl:for-each> </xsl:template>

回答 1 投票 0

XSLT 尝试使用 xsl:if 排除某些记录,但不起作用

我是 xslt 新手,我正在使用以下 XML 我是 xslt 新手,我正在使用以下 XML <?xml version='1.0' encoding='UTF-8'?> <wd:Report_Data xmlns:wd="urn:com.workday.report/INT0194_Recruitics"> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2023-06-26T12:50:11.949-07:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000051703</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-02-29T13:26:32.874-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0000704156</wd:candidate> <wd:Requisition_ID>R-0000076253</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>0</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:35.698-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:41:54.044-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:42:50.630-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:19.091-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Screen"> <wd:ID wd:type="WID">2d0e4a68825d4d2a8c507af7542d3f15</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">SCREEN</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:43:39.613-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Assessment"> <wd:ID wd:type="WID">bb01594c858710000e4d46d2b7220034</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">ASSESSMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:45:00.608-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:52:33.923-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer (Employment Agreement)"> <wd:ID wd:type="WID">1d57fbe8504d100015945d2b2704006a</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">EMPLOYMENT_AGREEMENT</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Background Check"> <wd:ID wd:type="WID">be56571f9f6f45ca82871c8bec853f5e</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">BACKGROUND</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-11T09:56:25.485-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Ready for Hire"> <wd:ID wd:type="WID">edd55803e2ec49c3a6eb01daadfc9bf9</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">HIRED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721053</wd:candidate> <wd:Requisition_ID>R-0000106433</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:30.187-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-10T12:15:49.308-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Offer"> <wd:ID wd:type="WID">868a8156682541f2aadc2fe90268b75f</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">OFFER</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721051</wd:candidate> <wd:Requisition_ID>R-0000098017</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-12T11:52:49.381-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Interview"> <wd:ID wd:type="WID">3317e4265cf94b91873b7015881a0e9c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">INTERVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721060</wd:candidate> <wd:Requisition_ID>R-0000103689</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-16T09:52:14.424-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Rejected"> <wd:ID wd:type="WID">9a35fa5882c24620a777de1dbcf34d3c</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REJECTED</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721062</wd:candidate> <wd:Requisition_ID>R-0000086280</wd:Requisition_ID> </wd:Report_Entry> <wd:Report_Entry> <wd:Job_Requisition_group> <wd:Is_Evergreen>1</wd:Is_Evergreen> </wd:Job_Requisition_group> <wd:Job_Application_Process_Statuses_group> <wd:Last_Functionally_Updated>2024-12-17T22:12:11.799-08:00</wd:Last_Functionally_Updated> <wd:Stage wd:Descriptor="Review"> <wd:ID wd:type="WID">31350d72f899430fb446b410c1e368cd</wd:ID> <wd:ID wd:type="Recruiting_Stage_ID">REVIEW</wd:ID> </wd:Stage> </wd:Job_Application_Process_Statuses_group> <wd:candidate>C-0001721063</wd:candidate> <wd:Requisition_ID>R-0000085728</wd:Requisition_ID> </wd:Report_Entry> </wd:Report_Data> 我当前的 xslt 正在做我需要它做的事情,但是,我想添加 1 个逻辑,如果 <wd:Is_Evergreen> 不等于 0(例如,如果它等于 1),则忽略 <wd:Report_Entry>。基本上我希望我的 xslt 跳过任何 <wd:Report_Entry> 它的 <wd:Is_Evergreen> 不等于 0。 我认为这可以简单地使用 <xsl:if> 来完成,所以我尝试在 for-each 之后添加 <xsl:if test="../wd:Job_Requisition_group/wd:Is_Evergreen = '0'">,但它不起作用,根本没有输出 下面是我的 xslt,我试图在其中添加此过滤器逻辑 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wd="urn:com.workday.report/INT0194_Recruitics" exclude-result-prefixes="wd"> <xsl:output method="text" omit-xml-declaration="no"/> <xsl:variable name="RECORD-DELIMITER"> <xsl:text>&#xd;&#xa;</xsl:text> </xsl:variable> <xsl:param name="Dilim">","</xsl:param> <xsl:param name="Quote">"</xsl:param> <xsl:param name="Comma">,</xsl:param> <xsl:variable name="FIELD-DELIMITER"> <xsl:value-of select="$Dilim"/> </xsl:variable> <xsl:variable name="STARTING-QUOTE"> <xsl:value-of select="$Quote"/> </xsl:variable> <xsl:template match="wd:Report_Data"> <Header> <HeaderItem1>"time_stamp"</HeaderItem1> <xsl:value-of select="$Comma"/> <HeaderItem2>"event"</HeaderItem2> <xsl:value-of select="$Comma"/> <HeaderItem3>"applyflow_id"</HeaderItem3> <xsl:value-of select="$Comma"/> <HeaderItem4>"job_id"</HeaderItem4> </Header> <xsl:value-of select="$RECORD-DELIMITER"/> <xsl:for-each-group select="wd:Report_Entry/wd:Job_Application_Process_Statuses_group" composite="yes" group-by="../wd:candidate, ../wd:Requisition_ID , wd:Stage/wd:ID"> <xsl:for-each select="(current-group() => sort((), function($j) { $j/wd:Last_Functionally_Updated }))[last()]"> <xsl:value-of select="$STARTING-QUOTE"/> <time_stamp> <!--<xsl:value-of select="wd:Last_Functionally_Updated"/>--> <xsl:value-of select="format-dateTime(wd:Last_Functionally_Updated, '[M01]/[D01]/[Y0001] [H01]:[m01]:[s01]')"/> </time_stamp> <xsl:value-of select="$FIELD-DELIMITER"/> <event> <xsl:value-of select="wd:Stage/@wd:Descriptor"/> </event> <xsl:value-of select="$FIELD-DELIMITER"/> <applyflow_id> <xsl:value-of select="../wd:candidate"/> </applyflow_id> <xsl:value-of select="$FIELD-DELIMITER"/> <job_id> <xsl:value-of select="../wd:Requisition_ID"/> </job_id> <xsl:value-of select="$STARTING-QUOTE"/> <xsl:value-of select="$RECORD-DELIMITER"/> </xsl:for-each> </xsl:for-each-group> </xsl:template> </xsl:stylesheet> 请让我知道我哪里做错了以及如何正确地做。 代替 select="wd:Report_Entry... 使用 select="wd:Report_Entry[wd:Job_Requisition_group/wd:Is_Evergreen = 0]...

回答 1 投票 0

XSLT 使用来自不同节点级别的 3 个不同元素进行分组

我是 XSLT 新手,对于下面的 XML,我正在尝试实现此转换逻辑:如果 、 和 具有相同的 val 组合...

回答 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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.