xslt-1.0 相关问题

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

XSLT:消除集合中具有合格节点的 XML 节点 (XSLT 1.0)

假设我有以下 XML: 假设我有以下 XML: <School> <Class name="Biology"/> <Class name="Math"/> <Class name="English"/> <Student className="Biology" Name="Chris"/> <Student className="English" Name="Kevin"/> <Student className="Biology" Name="Tania"/> <Student className="Math" Name="Kevin"/> <Student className="English" Name="Tania"/> </School> 我想做的(在 XSLT 1.0 中)是消除名为“Tania”的“Student”节点以及通过“className”与它们相关的类节点。所以会产生这样的输出: <School> <Class name="Math"/> <Student className="Math" Name="Kevin"/> </School> 这是我会用钥匙做的事情吗? 此 XSLT 将产生所需的结果 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" standalone="yes" omit-xml-declaration="yes"/> <xsl:strip-space elements="*"/> <xsl:key name="st" match="Student" use="@Name"/> <xsl:template match="Class[@name = key('st', 'Tania')/@className]"/> <xsl:template match="Student[@className = key('st', 'Tania')/@className]"/> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

使用具有 select 语句的变量作为布尔值

在 XSLT 1.0 中,我正在创建一个其中包含 select 语句的变量。这样做的目的是在变量中处理一次逻辑。然后将该变量用作布尔下游变量或...

回答 1 投票 0

计算 xslt 1.0 中的多个键值

我想为每个罐头、锡罐获取唯一的代码计数(这个名称可能会有所不同..) 所以输出应该是: 罐头 - 3 锡-2 可以 我想为每个 Can、Tin 获取唯一的代码计数(这个名称可能会有所不同..) 所以输出应该是: 罐头 - 3 锡 - 2 <root> <Item> <Pack> <Type>Can</Type> <Code>1234</Code> </Pack> <Pack> <Type>Tin</Type> <Code>3456</Code> </Pack> </Item> <Item> <Pack> <Type>Can</Type> <Code>1234</Code> </Pack> <Pack> <Type>Can</Type> <Code>7890</Code> </Pack> </Item> <Item> <Pack> <Type>Tin</Type> <Code>3478</Code> </Pack> <Pack> <Type>Can</Type> <Code>7890</Code> </Pack> </Item> </root> 我已经使用 key 连接了 2 个节点 <xsl:key name="K1" match="Pack" use="concat(Type, '|', Code)" /> <xsl:for-each select="root/Item/Pack[count(. | key('K1', concat(Type,'|', Code) )[1]) = 1]"> <xsl:value-of select="Type"/> <xsl:value-of select="count(key('K1', concat(Type,'|', Code)))"/> </xsl:for-each> 目前我得到: 坎2 坎1 坎1 锡1 锡1 假设您实际上想要计算每个 Item 中 Type 的数量(其中 Item 可以存在于多个 Type 中),请尝试: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:key name="pack-by-type" match="Pack" use="Type" /> <xsl:template match="/root"> <!-- for each distinct Type --> <xsl:for-each select="Item/Pack[count(. | key('pack-by-type', Type)[1]) = 1]"> <xsl:value-of select="Type"/> <xsl:text> - </xsl:text> <!-- count the number of Items with this Type --> <xsl:value-of select="count(key('pack-by-type', Type)/..)"/> <xsl:text>&#10;</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>

回答 1 投票 0

根据某些条件将元素移动到父元素下

我是 XSLT 新手,因此需要一些有关此问题的帮助 我有以下输入 XML 我是 XSLT 新手,因此需要有关此问题的一些帮助 我有以下输入 XML <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SubmitImportJobRequest xmlns="/cp/bdtbeans"> <User>abc</User> <Client>qwe</Client> <Password>00000</Password> <JobName>CMBX_TEST</JobName> <UserAssets Owner="abc" EffectiveStartDate="2023-04-03"> <CDSwaps> <CDS ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" BARRAID="28881002_8" StartDate="2023-12-22" ExpirationDate="2028-12-22" ContractSize="1" AccrualBasis="ACT/360" PriceCurrency="USD" UnderlierID="US037833EJ59" UnderlierIDType="ISIN" DealSpread="100"/> </CDSwaps> <CMBXs> <CMBX ID="32083535_8" IDType="LOCALID" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" BARRAID="32083535_8" ContractSize="1" RecoveryRate="40" PriceCurrency="USD" StartDate="2022-12-20" ExpirationDate="2028-03-09" UnderlierID="137BENAO4" UnderlierIDType="MIP" DealSpread="50"/> </CMBXs> </UserAssets> </SubmitImportJobRequest> </s:Body> </s:Envelope> 当前输出XML <Logical> <UserInstruments Effective_Start_Date="2023-04-03" Owner="paqa"> <CDSwaps xmlns="/cp/bdtbeans"> <CDS AccrualBasis="ACT/360" Priority="BARRA" BARRAID="28881002_8" ContractSize="1" CouponFrequency="3M" DealSpread="100" ExpirationDate="2028-12-22" ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" PriceCurrency="USD" RecoveryRate="4.0E1" StartDate="2023-12-22" Und_ID="US037833EJ59" Und_IDType="ISIN"/> <CDS Priority="BARRA" BARRAID="32083535_8" ContractSize="1" DealSpread="50" ExpirationDate="2028-03-09" ID="32083535_8" IDType="LOCALID" IsCMBX="true" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" PriceCurrency="USD" RecoveryRate="40" StartDate="2022-12-20" Und_ID="137BENAO4" Und_IDType="MIP"/> </CDSwaps> </UserInstruments> </Logical> 所需输出 <Logical> <UserInstruments Effective_Start_Date="2023-04-03" Owner="paqa"> <CDSwaps xmlns="/cp/bdtbeans"> <CDS AccrualBasis="ACT/360" Priority="BARRA" BARRAID="28881002_8" ContractSize="1" CouponFrequency="3M" DealSpread="100" ExpirationDate="2028-12-22" ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" PriceCurrency="USD" RecoveryRate="4.0E1" StartDate="2023-12-22" Und_ID="US037833EJ59" Und_IDType="ISIN"/> <CDS Priority="BARRA" BARRAID="32083535_8" ContractSize="1" DealSpread="50" ExpirationDate="2028-03-09" ID="32083535_8" IDType="LOCALID" IsCMBX="true" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" PriceCurrency="USD" RecoveryRate="40" StartDate="2022-12-20" Und_ID="137BENAO4" Und_IDType="MIP"/> </CDSwaps> </UserInstruments> </Logical> 用于此转换的 XSLT <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bdt="/cp/bdtbeans"> <xsl:template match="node() | @*" > <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="bdt:CDSwaps"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> <xsl:apply-templates select="//bdt:CMBX"/> </xsl:copy> </xsl:template> <xsl:template match="bdt:CMBXs"/> <xsl:template match="bdt:CMBX"> <xsl:element name="CDS"> <xsl:apply-templates select="node() | @*"/> </xsl:element> </xsl:template> </xsl:stylesheet> 如何在 XSLT 中应用条件,以便仅当输入 XML 中存在 CDSwaps 和 CMBX 标签时才发生所有这些复制和重命名 CMBX 元素的语句? 将此模板添加到您的 xslt: <xsl:template match="/*[not(.//bdt:CDSwaps and .//bdt:CMBXs)]"/>

回答 1 投票 0

在父元素下复制元素时删除 xmlns 属性。并根据条件执行一些xslt语句

我是 XSLT 新手,因此需要一些有关此问题的帮助 我有以下输入 XML 我是 XSLT 新手,因此需要有关此问题的一些帮助 我有以下输入XML <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SubmitImportJobRequest xmlns="/cp/bdtbeans"> <User>abc</User> <Client>qwe</Client> <Password>00000</Password> <JobName>CMBX_TEST</JobName> <UserAssets Owner="abc" EffectiveStartDate="2023-04-03"> <CDSwaps> <CDS ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" BARRAID="28881002_8" StartDate="2023-12-22" ExpirationDate="2028-12-22" ContractSize="1" AccrualBasis="ACT/360" PriceCurrency="USD" UnderlierID="US037833EJ59" UnderlierIDType="ISIN" DealSpread="100"/> </CDSwaps> <CMBXs> <CMBX ID="32083535_8" IDType="LOCALID" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" BARRAID="32083535_8" ContractSize="1" RecoveryRate="40" PriceCurrency="USD" StartDate="2022-12-20" ExpirationDate="2028-03-09" UnderlierID="137BENAO4" UnderlierIDType="MIP" DealSpread="50"/> </CMBXs> </UserAssets> </SubmitImportJobRequest> </s:Body> </s:Envelope> 当前输出XML <Logical> <UserInstruments Effective_Start_Date="2023-04-03" Owner="paqa"> <CDSwaps xmlns="/cp/bdtbeans"> <CDS AccrualBasis="ACT/360" Priority="BARRA" BARRAID="28881002_8" ContractSize="1" CouponFrequency="3M" DealSpread="100" ExpirationDate="2028-12-22" ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" PriceCurrency="USD" RecoveryRate="4.0E1" StartDate="2023-12-22" Und_ID="US037833EJ59" Und_IDType="ISIN"/> <CDS xmlns="" Priority="BARRA" BARRAID="32083535_8" ContractSize="1" DealSpread="50" ExpirationDate="2028-03-09" ID="32083535_8" IDType="LOCALID" IsCMBX="true" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" PriceCurrency="USD" RecoveryRate="40" StartDate="2022-12-20" Und_ID="137BENAO4" Und_IDType="MIP"/> </CDSwaps> </UserInstruments> </Logical> 所需输出 <Logical> <UserInstruments Effective_Start_Date="2023-04-03" Owner="paqa"> <CDSwaps xmlns="/cp/bdtbeans"> <CDS AccrualBasis="ACT/360" Priority="BARRA" BARRAID="28881002_8" ContractSize="1" CouponFrequency="3M" DealSpread="100" ExpirationDate="2028-12-22" ID="28881002_8" IDType="LOCALID" Name="Buy Protection on Apple Inc" PriceCurrency="USD" RecoveryRate="4.0E1" StartDate="2023-12-22" Und_ID="US037833EJ59" Und_IDType="ISIN"/> <CDS Priority="BARRA" BARRAID="32083535_8" ContractSize="1" DealSpread="50" ExpirationDate="2028-03-09" ID="32083535_8" IDType="LOCALID" IsCMBX="true" Name="Sell Protection on CMBX.NA.AAA Indices Series 15 V1" PriceCurrency="USD" RecoveryRate="40" StartDate="2022-12-20" Und_ID="137BENAO4" Und_IDType="MIP"/> </CDSwaps> </UserInstruments> </Logical> 用于此转换的 XSLT <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bdt="/cp/bdtbeans"> <xsl:template match="node() | @*" > <xsl:copy> <xsl:apply-templates select="node() | @*"/> </xsl:copy> </xsl:template> <xsl:template match="bdt:CDSwaps"> <xsl:copy> <xsl:apply-templates select="node() | @*" /> <xsl:apply-templates select="//bdt:CMBX"/> </xsl:copy> </xsl:template> <xsl:template match="bdt:CMBXs"/> <xsl:template match="bdt:CMBX"> <xsl:element name="CDS"> <xsl:apply-templates select="node() | @*"/> </xsl:element> </xsl:template> </xsl:stylesheet> 在 CDSwaps 下移动 CMBX 元素时,添加了一个额外的属性 xmlns="",我不需要这个属性。 如何在 XSLT 中应用条件,以便仅当输入 XML 中存在 CDSwaps 和 CMBX 标签时才发生所有这些复制和重命名 CMBX 元素的语句? 如有任何帮助,我们将不胜感激。 首先,当前的输出根本不是你说的那样。 接下来,当你这么说时: 在 CDSwaps 下移动 CMBX 元素时,添加了额外的属性 xmlns="",我不需要此属性。 您完全误判了问题。这里真正发生的是,SubmitImportJobRequest元素及其所有后代都位于/cp/bdtbeans命名空间中,并且在复制时它们仍保留在该命名空间中。 但是,当您创建一个 new 元素 CDS 作为从 CMBX 元素移动的节点的包装器时,您正在无命名空间中创建一个元素 - 并且处理器必须将其标记为此类。 为了在与其祖先(和潜在后代)元素相同的命名空间中创建包装器,请更改此: <xsl:element name="CDS"> 至: <xsl:element name="CDS" namespace="/cp/bdtbeans">

回答 1 投票 0

如何设置javax.xml.transform.TransformerFactory系统属性

我正在使用 javax.xml.transform.Transform 将 XML 文件转换为 PDF。这本身工作得很好,但项目的某些部分正在使用 Xalan,它实现了自己的 TransformerFactory,并且

回答 3 投票 0

xslt 或 xquery 在当前时间上添加分钟

我想创建一个安全标头,如下所示: 我想创建一个安全标头,如下所示: <soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd xmlns:wsu=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd> <wsu:Timestamp wsu:Id="TS-E157FC3B34ADB1C4DF16976549459948"> <wsu:Created>2023-10-18T18:49:05.994Z</wsu:Created> <wsu:Expires>2023-10-18T18:50:05.994Z</wsu:Expires> </wsu:Timestamp> </wsse:Security> 对于 <wsu:Created>2023-10-18T18:49:05.994Z</wsu:Created> 我想要当前日期时间并且 <wsu:Expires> </wsu:Expires> has to be 1 min more than current time xslt 1.0 中是否有任何函数可以用来获取当前日期时间并比它多 1 分钟或在 xquery 中 这在 XSLT 1.0 中实现起来很困难,但在 XSLT 2.0 或 XQuery 1.0(共享相同的函数库)中却很容易。简直就是 current-dateTime() + xs:dayTimeDuration('PT1M')

回答 1 投票 0

用于在父段下插入段的 XSLT 代码

我有一个输入XML文档,其中需要在父段下移动几个段,条件是当为“8R”时,应位于段下。对于其他...

回答 1 投票 0

XML,其中包含 JSON,其中包含数组:迭代该数组

我有这个XML: “国家列表”: [ { “国家名称”:“英国”, “国家ID”:“909”, “国家首都”:“伦敦” }, { ”

回答 1 投票 0

我有一个 xml,其中有一个 json,里面有一个数组。我正在尝试迭代该数组,但面临困难

我有以下 xml: “国家列表”: [ { “国家名称”:“英国”, “国家ID”:“909”, “国家首都”:“伦敦” }, { &q...

回答 1 投票 0

如何将 instr/substr 转换为 if-then-else 函数?

在 BI Publisher 中,我正在调整一个模板,该模板使用 Word 中的扩展 XSL 显示销售订单。每个销售订单都有一个不同的前缀,例如'SAMPLE_'、'ECOM_'、'B2B_' 等或无前缀。 ...

回答 2 投票 0

将表格中的一行数据居中,以便数据在中心列对齐

下午好, 我可以用一只手。最终我想做的是生成一个表,其中填充每行数据,使其以特定列为中心,而决定因素...

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

XSL 模板不匹配

我有一个非常简单的 XSL,我正在尝试匹配 servlet 元素并添加一个子节点。实际上,我需要匹配一个特定的 servlet,但一次只匹配一件事...无论我使用什么模式,都超出...

回答 1 投票 0

使用 xslt 将 XML 转为 CSV 创建额外的行

我有这个 XML,我想要 csv 格式: 我正在使用 python 和 lxml.etree 库 我有这个XML,我想要一个csv格式: 我正在使用 python 和 lxml.etree 库 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <RsuProtocol schemaVersion="1.11" RefSchemaFile="xxxx.xsd"> <UpdateStep> <Phase>x1Activation</Phase> <TimestampStart>1687771672000</TimestampStart> <TimestampEnd>1687771828000</TimestampEnd> </UpdateStep> <UpdateStep> <Phase>x2Execution</Phase> <TimestampStart>1687771828000</TimestampStart> <TimestampEnd>1687771907000</TimestampEnd> <Warning> <WarnCode>0x00000000</WarnCode> <Count>2</Count> <FirstOccurrence>1687771907</FirstOccurrence> <SpecificWarnCode>blablabla</SpecificWarnCode> <WarnMessage>Hello</WarnMessage> </Warning> <Warning> <WarnCode>0x11111111</WarnCode> <Count>1</Count> <FirstOccurrence>1687771907</FirstOccurrence> <SpecificWarnCode>helo</SpecificWarnCode> <WarnMessage>Hello</WarnMessage> </Warning> </UpdateStep> <UpdateStep> <Phase>x3MguCompletion</Phase> <TimestampStart>1687771907000</TimestampStart> <TimestampEnd>1687771965000</TimestampEnd> </UpdateStep> </RsuProtocol> 我想要这样的输出: "1","x1Activation","","2023-06-26 09:27:52.000000000","2023-06-26 09:30:28.000000000","","","","","" "2","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x00000000","2","2023-06-26 09:31:47.000000000","blablabla","Hello" "3","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x11111111","1","2023-06-26 09:31:47.000000000","helo","Hello" "4","x3Completion","","2023-06-26 09:31:47.000000000","2023-06-26 09:32:45.000000000","","","","","" 我有这样的输出: "1","x1Activation","","2023-06-26 09:27:52.000000000","2023-06-26 09:30:28.000000000","","","","","" "2","x2Execution","","2023-06-26 09:30:28.000000000","2023-06-26 09:31:47.000000000","0x00000000","2","2023-06-26 09:31:47.000000000","blablabla","Hello" "3","x3Completion","","2023-06-26 09:31:47.000000000","2023-06-26 09:32:45.000000000","","","","","" 使用我正在使用的 xslt,我仅获取 Phase= 'x2Execution' 的一行,我想获取两个“警告”信息,该阶段的每一行各一个。 这是我正在使用的xslt: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/RsuProtocol" name="FBM_UPDATE"> <xsl:for-each select="UpdateStep"> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="position()"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Phase"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="DiagnosisAddress"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="TimestampStart"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="TimestampEnd"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/WarnCode"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/Count"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data"> <xsl:call-template name="get-datetime-from-timestamp"> <xsl:with-param name="timestamp"> <xsl:call-template name="convert-to-null"> <xsl:with-param name="input" select="Warning/FirstOccurrence"/> <xsl:with-param name="value" select="'-1'"/> </xsl:call-template> </xsl:with-param> </xsl:call-template> </xsl:with-param> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/SpecificWarnCode"/> </xsl:call-template> <xsl:call-template name="format-csv-field"> <xsl:with-param name="data" select="Warning/WarnMessage"/> <xsl:with-param name="no-delim" select="'true'"/> </xsl:call-template> <xsl:value-of select="$new-line"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> 您发布的样式表会抛出错误,因为指定的模板丢失。 不过,我认为实际问题已经足够清楚了,所以这里有一个简化的示例,您可以将其用作起点: XSLT 1.0 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" /> <xsl:template match="/RsuProtocol"> <xsl:apply-templates select="UpdateStep"/> </xsl:template> <xsl:template match="UpdateStep"> <xsl:variable name="common"> <xsl:text>,</xsl:text> <xsl:value-of select="Phase"/> <xsl:text>,</xsl:text> <xsl:value-of select="TimestampStart"/> <xsl:text>,</xsl:text> <xsl:value-of select="TimestampEnd"/> <xsl:text>,</xsl:text> </xsl:variable> <xsl:choose> <xsl:when test="Warning"> <xsl:apply-templates select="Warning"> <xsl:with-param name="common" select="$common"/> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:number count="UpdateStep[not(Warning)] | Warning" level="any"/> <xsl:value-of select="$common"/> <xsl:text>"",""&#10;</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="Warning"> <xsl:param name="common"/> <xsl:number count="UpdateStep[not(Warning)] | Warning" level="any"/> <xsl:value-of select="$common"/> <xsl:value-of select="WarnCode"/> <xsl:text>,</xsl:text> <xsl:value-of select="Count"/> <xsl:text>&#10;</xsl:text> </xsl:template> </xsl:stylesheet> 应用于您的输入 XML 示例,这将产生: 结果 1,x1Activation,1687771672000,1687771828000,"","" 2,x2Execution,1687771828000,1687771907000,0x00000000,2 3,x2Execution,1687771828000,1687771907000,0x11111111,1 4,x3MguCompletion,1687771907000,1687771965000,"","" 或者,您可以分两遍进行转换:首先,通过使每个警告成为一个完整步骤(包含父步骤中的所有数据)来“展平”输入;然后统一处理结果,为每个步骤创建一行。

回答 1 投票 0

使用 xslt 1.0 将 xml(带有 json)转换为 json 响应

我有一个请求 xml,其中有一个 json -> 我想使用 xslt 将其映射到另一个 json。我正在使用 xslt 1.0。有没有办法在 xslt 1.0 中实现这一点: 请求的xml为: ...

回答 1 投票 0

XSLT 1.0 在字符串中将值相加

我正在尝试使用 XSLT 1.0 将字符串中的数字相加 我在名为 cols 的变量中有一个字符串,该变量的示例值为“10 20 30 20pt” 我正在尝试添加我的数字...

回答 1 投票 0

XSLT 数学帮助 - “XSL:value-of select”语句内部

我无法在 XSLT 中进行数学计算。这是代码片段: $ 我无法在 XSLT 中进行数学计算。这是代码片段: $<xsl:value-of select="(((sum(LOOPSAC[SAC/SAC01='C']/SAC/SAC05)-sum(LOOPSAC[SAC/SAC01='A']/SAC/SAC05)) div 100) +sum(LOOPIT1/TXI/TXI02))"/> 我需要将所有 SAC05 值相加,当 SAC01 = A 时扣除 SAC05 值,然后将总数除以 100。然后我需要添加 TXI02 值(这些值不需要除以 100)。 由于某种原因,上述代码未将 TXI02 值包含在总数中。它正在很好地计算第一部分。 谢谢! 马特 这是一个示例 XML 文件,显示了我正在使用的内容。上面的代码用于计算“小计”字段。 <?xml version="1.0"?> -<Document-810> -<HEADER> -<ST> <Version>4010</Version> <Interchange FunctionalIdentifier="IN" InterchangeDate="230907" ReceiverID="TEST" SenderID="TEST"> </Interchange> <ST01>810</ST01> <ST02>0012</ST02> </ST> -<BIG> <BIG01>20230906</BIG01> <BIG02>123456</BIG02> <BIG03> </BIG03> <BIG04> </BIG04> <BIG05> </BIG05> <BIG06> </BIG06> <BIG07>PR</BIG07> <BIG08>00</BIG08> </BIG> -<REF> <REF01>12</REF01> <REF02>123456</REF02> <REF03>BILLING ACCOUNT NUMBER</REF03> </REF> -<LOOPN1> -<N1> <N101>RE</N101> <N102>TEST ENERGY</N102> <N103>1</N103> <N104>006915953</N104> <N105> </N105> <N106>41</N106> </N1> -<N3> <N301>ADDRESS FIELD</N301> </N3> -<N4> <N401>MINNEAPOLIS</N401> <N402>MN</N402> <N403>554849477</N403> </N4> -<PER> <PER01>IC</PER01> <PER02> </PER02> <PER03>TE</PER03> <PER04>8004814700</PER04> </PER> </LOOPN1> -<LOOPN1> -<N1> <N101>BT</N101> <N102>TEST ADDRESS</N102> <N103>ZZ</N103> <N104>TEST</N104> <N105> </N105> <N106>40</N106> </N1> -<N3> <N301>123456 MAIN ST</N301> </N3> -<N4> <N401>DENVER</N401> <N402>CO</N402> <N403>802042305</N403> </N4> -<PER> <PER01>IC</PER01> <PER02>JOE SMITH</PER02> <PER03>TE</PER03> <PER04>3037579567</PER04> </PER> -<ITD> <ITD01> </ITD01> <ITD02> </ITD02> <ITD03> </ITD03> <ITD04> </ITD04> <ITD05> </ITD05> <ITD06>20230926</ITD06> </ITD> -<BAL> <BAL01>P</BAL01> <BAL02>PB</BAL02> <BAL03>64.87</BAL03> </BAL> -<BAL> <BAL01>P</BAL01> <BAL02>TP</BAL02> <BAL03>64.87</BAL03> </BAL> -<BAL> <BAL01>M</BAL01> <BAL02>J9</BAL02> <BAL03>0</BAL03> </BAL> -<BAL> <BAL01>M</BAL01> <BAL02>PB</BAL02> <BAL03>78.66</BAL03> </BAL> -<BAL> <BAL01>M</BAL01> <BAL02>YB</BAL02> <BAL03>78.66</BAL03> </BAL> </LOOPN1> </HEADER> -<DETAIL> -<LOOPIT1> -<IT1> <IT101>000001</IT101> <IT102> </IT102> <IT103> </IT103> <IT104> </IT104> <IT105> </IT105> <IT106>SV</IT106> <IT107>ELECTRIC</IT107> <IT108>C3</IT108> <IT109>METER</IT109> </IT1> -<TXI> <TXI01>OH</TXI01> <TXI02>0.75</TXI02> <TXI03> </TXI03> <TXI04> </TXI04> <TXI05> </TXI05> <TXI06> </TXI06> <TXI07> </TXI07> <TXI08> </TXI08> <TXI09> </TXI09> <TXI10>Energy Assistance Ch</TXI10> </TXI> -<MEA> <MEA01>AA</MEA01> <MEA02>MU</MEA02> <MEA03>1</MEA03> <MEA04>KH</MEA04> <MEA05>39566</MEA05> <MEA06>40029</MEA06> <MEA07>51</MEA07> </MEA> -<LOOPPID> -<PID> <PID01>F</PID01> <PID02> </PID02> <PID03> </PID03> <PID04> </PID04> <PID05>ENERGY SERVICE</PID05> </PID> -<REF> <REF01>LU</REF01> <REF02>304604770</REF02> <REF03>PREMISE ACCOUNT NUMBER</REF03> </REF> -<REF> <REF01>MG</REF01> <REF02>000081951065</REF02> <REF03>METER NUMBER</REF03> </REF> -<REF> <REF01>NH</REF01> <REF02>C</REF02> <REF03>COMMERCIAL SERVICE</REF03> </REF> -<DTM> <DTM01>150</DTM01> <DTM02>20230804</DTM02> </DTM> -<DTM> <DTM01>151</DTM01> <DTM02>20230905</DTM02> </DTM> </LOOPPID> -<LOOPSLN> -<SLN> <SLN01>000001</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>N</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ENC001</SAC04> <SAC05> </SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08> </SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>TOTAL ENERGY</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000002</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ENC001</SAC04> <SAC05>4098</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.08852</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>COMMERCIAL SERVICE</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000003</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>FFR001</SAC04> <SAC05>1168</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>5.84</SAC08> <SAC09>EA</SAC09> <SAC10>2</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>SERVICE AND FACILITY</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000004</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>40</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.00086</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>TRANS COST ADJ</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000005</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>1369</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.02956</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>ELEC COMMODITY ADJ</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000006</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>86</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.00186</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>DEMAND SIDE MGMT COST</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000007</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>188</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.00406</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>PURCH CAP COST ADJ</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000008</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>FFR001</SAC04> <SAC05>73</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.009818</SAC08> <SAC09>EA</SAC09> <SAC10>74.35</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>RENEW. ENERGY STD ADJ</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000009</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>73</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.009818</SAC08> <SAC09>KH</SAC09> <SAC10>74.35</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>COLO ENERGY PLAN ADJ</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000010</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>542</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.0117</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>GRSA E</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000011</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>5</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.0001</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>TRANS ELEC PLAN</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000012</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>-61</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>-0.00131</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>RDA</SAC15> </SAC> </LOOPSAC> -<LOOPSLN> -<SLN> <SLN01>000013</SLN01> <SLN02> </SLN02> <SLN03>A</SLN03> </SLN> </LOOPSLN> -<LOOPSAC> -<SAC> <SAC01>C</SAC01> <SAC02> </SAC02> <SAC03>EU</SAC03> <SAC04>ADJ002</SAC04> <SAC05>210</SAC05> <SAC06> </SAC06> <SAC07> </SAC07> <SAC08>0.00453</SAC08> <SAC09>KH</SAC09> <SAC10>463</SAC10> <SAC11> </SAC11> <SAC12> </SAC12> <SAC13> </SAC13> <SAC14> </SAC14> <SAC15>EGCRR</SAC15> </SAC> </LOOPSAC> -<LOOPN1> -<N1> <N101>MQ</N101> <N102>CDOT R1430-010</N102> </N1> -<N3> <N301>6019 W 52ND AVE</N301> </N3> -<N4> <N401>ARVADA</N401> <N402>CO</N402> <N403>80002</N403> </N4> </LOOPN1> </LOOPIT1> </DETAIL> -<SUMMARY> -<TDS> <TDS01>7866</TDS01> </TDS> -<CTT> <CTT01>1</CTT01> </CTT> -<SE> <SE01>58</SE01> <SE02>0012</SE02> </SE> </SUMMARY> </Document-810> AFAICT,LOOPSAC 是 LOOPIT1 的子项。 您没有显示计算的上下文,但如果表达式: sum(LOOPSAC[SAC/SAC01='C']/SAC/SAC05) 有效,那么你一定处于LOOPIT1的上下文中。 现在,TX1也是LOOPIT1的孩子。因此,如果您已经处于 LOOPIT1 的上下文中,则表达式: sum(LOOPIT1/TXI/TXI02) 将返回 0,因为 LOOPIT1 不是其自身的子节点,并且该路径没有选择任何节点。它需要是: sum(TXI/TXI02) 如果您从隔离表达式开始,您就可以自己推导出所有这些: count(LOOPIT1/TXI/TXI02) 并从那里继续。

回答 1 投票 0

通过属性匹配特定节点需要 XPATH

给定 XML 内容 内容2 给定 XML <lists> <list> <param type="a">content</param> </list> <list> <param type="b">content2</param> </list> <list> <param type="a">content</param> <param type="b">content2</param> </list> <list> <param type="c">content3</param> </list> </lists> 我需要处理任何list/param[@type = 'a'|'b'],我可以做到这一点,但我想要整个parent:list,并在可能有多个child::param时循环,我可以做到这一点。我只是不确定如何根据类型“a”或类型“b”的匹配来获取具有any param attribute的整个父节点。 (需要 XPATH) 然后我需要处理任何 list without a param[@type = 'a'|'b'],我可以做到。但需要正确的 XPATH 才能得到它,因为我正在经历 lists 我的模板现在只匹配“列表”,但需要一个“分支”?选择/何时/否则 (?) - 我不确定 XPATH 语法是否正确。 谢谢,我只是想节省时间而不进行尝试和错误! 我尝试了很多东西,并且知道我的路径不正确。 所以只是看看我是否有什么问题。 带有 a 或 b 的列表的 XPath list[param[@type[. = 'a' or . = 'b']]] 不带 a 或 b 的列表的 XPath list[not(param[@type[. = 'a' or . = 'b']])]

回答 1 投票 0

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