【问题标题】:Parsing a variable containing xml string in xslt在 xslt 中解析包含 xml 字符串的变量
【发布时间】:2019-11-19 08:12:24
【问题描述】:

我正在尝试使用 xslt 形成一个 html 模板,我需要从包含 xml 字符串的变量中解析值。但不能这样做。如果我尝试打印变量,它会显示整个 xml 字符串,其中 <> 分别被 <> 替换,但在尝试时不会被 xpath 解析。

下面是我存储在名为“SpecificOrderDetails”的变量中的 xml 字符串。如果我尝试表达

<xsl:value-of select="$SpecificOrderDetails/SPECIFICORDERDETAILS/text()"/>

它给了我空值作为输出

<SPECIFICORDERDETAILS><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Hard-wired Return Path</COMPONENTNAME><COMPONENTID>101401</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Platinum Included FBO Movies</COMPONENTNAME><COMPONENTID>101500</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>iQ Discount</COMPONENTNAME><COMPONENTID>101501</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Primary Discounts</COMPONENTNAME><COMPONENTID>101504</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>03 Foxtel iQ</COMPONENTNAME><COMPONENTID>101601</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>TV - 24 Month Contract</COMPONENTNAME><COMPONENTID>101714</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Standard Install - No Offer</COMPONENTNAME><COMPONENTID>101723</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>My Platinum Eligibility</COMPONENTNAME><COMPONENTID>101900</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Commitment Eligibility</COMPONENTNAME><COMPONENTID>101913</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>1</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Platinum Channels</COMPONENTNAME><COMPONENTID>990015</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>4</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>Smartcard</COMPONENTNAME><COMPONENTID>101</COMPONENTID></ORDERROW><ORDERROW><CATEGORY>4</CATEGORY><ACTION>0</ACTION><COMPONENTNAME>iQ PDR - Satellite</COMPONENTNAME><COMPONENTID>201</COMPONENTID></ORDERROW></SPECIFICORDERDETAILS>

如果我尝试打印变量,它会显示整个 xml 字符串,如下所示

<tr>
   <td class="headingSubText" style="font-size:13pt; padding:10px 0px 0px 15px">&lt;SPECIFICORDERDETAILS&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Hard-wired Return Path&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101401&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Platinum
      Included FBO Movies&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101500&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;iQ
      Discount&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101501&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Primary
      Discounts&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101504&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;03
      Foxtel iQ&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101601&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;TV
      - 24 Month Contract&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101714&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Standard
      Install - No Offer&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101723&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;My
      Platinum Eligibility&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101900&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Commitment
      Eligibility&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101913&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;1&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Platinum
      Channels&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;990015&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;4&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;Smartcard&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;101&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;ORDERROW&gt;&lt;CATEGORY&gt;4&lt;/CATEGORY&gt;&lt;ACTION&gt;0&lt;/ACTION&gt;&lt;COMPONENTNAME&gt;iQ
      PDR - Satellite&lt;/COMPONENTNAME&gt;&lt;COMPONENTID&gt;201&lt;/COMPONENTID&gt;&lt;/ORDERROW&gt;&lt;/SPECIFICORDERDETAILS&gt;
   </td>
</tr>

请帮助某人如何解析 xslt 中的变量。如果我不够清楚,请告诉我。这是我在 stackoverflow 上提出的第一个问题。

【问题讨论】:

标签: html xml xml-parsing xslt-2.0 saxon


【解决方案1】:

搞定了!

使用 xmlns:saxon="http://saxon.sf.net/" 扩展为 xslt2.0,它可以完美地解析变量中的 xml 字符串,如下所示。

<xsl:value-of select="saxon:parse($SpecificOrderDetails)/SPECIFICORDERDETAILS/ORDERROW[ACTION ='0']"/>

感谢大家的帮助!

【讨论】:

  • 在 XSLT 3.0 中,这个 Saxon 扩展函数成为 W3C 标准的一部分,名称为 parse-xml()。 (说您必须使用 XSLT 2.0,然后使用 XSLT 2.0 的供应商扩展,这没有多大意义)。
  • 我尝试将 xslt 版本更改为 3.0 并尝试 parse-xml() ,但在使用某些“未知方法或函数 parse-xml() ”编译样式表时失败,因此尝试使用扩展.我不确定正在使用哪个 XSLT 处理器,但它似乎不支持 XSLT3.0
  • 了解您正在使用的 XSLT 处理器是个好主意。您可以使用&lt;xsl:message select="system-property('xsl:vendor'), system-property('xsl:product-version')"/&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2010-10-13
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多