如何在 xsl if 中使用 xsl 变量

2024-02-12

我正在尝试将 xsl 变量中的值分配给 xml 文件中的新节点。此代码有效,但当“lbi:GetCooperatives(PVAL)”的值为空时添加一个空的 PROP/PVAL 节点:

<xsl:template match="PROP" mode="Geocode">
<PROP NAME="Geocode">
    <PVAL>
      <xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
    </PVAL>
 </PROP>
 </xsl:template>

由于我不需要任何空节点,因此我尝试仅在“lbi:GetCooperatives(PVAL)”的值不为空时添加新节点。我尝试的方法是将值分配给变量并测试该变量,如下所示。不幸的是,当我这样做时,即使 lbi:GetCooperatives(PVAL) 返回非空值,我也没有得到新的 PROP 节点。

<xsl:template match="PROP" mode="Geocode">
<xsl:variable name="coords" select="'lbi:GetCoordinates(PVAL)'"/>
<xsl:if test="not(string-length(coords) = 0)">
  <PROP NAME="Geocode">
    <PVAL>
      <xsl:value-of select="coords"/>
    </PVAL>
  </PROP>
</xsl:if>
</xsl:template>

谁能指出我正确的方向,或者提出更好的方法来实现这一目标?

源xml是这样的:

<RECORD>
<PROP name="PostCode">
<PVAL>N11 1NN</PVAL>
</PROP>
</RECORD>

模板的引用如下:

<xsl:template match="RECORD">
<xsl:copy>
  <xsl:apply-templates select="PROP[@NAME='PostCode']" mode="Geocode"/>
</xsl:copy>

lbi:GetCoordinates() 方法位于作为 xml 命名空间添加的外部 .Net 程序集中。


使用这种方法有效:

<xsl:template match="PROP[string-length(lbi:GetCoordinates(PVAL))>0]" mode="Geocode">
  <PROP NAME="Geocode">
    <PVAL>
      <xsl:value-of select="lbi:GetCoordinates(PVAL)"/>
    </PVAL>
  </PROP>

现在的问题是,当 lbi:GetCooperatives 方法只需要调用一次时,它会被调用两次,源 xml 可能有 100,000 多个需要地理编码的元素,因此这并不简单。这表明我之前使用的 xsl:variable 表达式不正确,并且该变量始终以空结尾。


<xsl:variable name="coords" select="'lbi:GetCoordinates(PVAL)'"/> 
<xsl:if test="not(string-length(coords) = 0)"> 

这是“几乎”正确的。唯一的问题是周围的引号lbi:GetCoordinates(PVAL)。它们将扩展函数的返回值转换为调用该函数的表达式的字符串。由于该字符串的长度显然大于0,第二行的测试将始终为真。

从这里开始我想lbi:GetCoordinates()函数返回字符串或原子值(不是节点或节点集),因为你还没有说函数的返回类型,但这非常重要!

You want(请注意,现在缺少引号!):

<xsl:variable name="coords" select="lbi:GetCoordinates(PVAL)"/> 
<xsl:if test="not(string-length(coords) = 0)"> 

**但即使这样也有点笨拙。

Solution:使用 XSLT 模板匹配模式的强大功能并完全避免模板内的条件逻辑:

<xsl:template match="PROP[string-length(lbi:GetCoordinates(PVAL))]"
     mode="Geocode">
  <PROP NAME="Geocode">                     
    <PVAL>                     
      <xsl:value-of select="lbi:GetCoordinates(PVAL)"/>                     
    </PVAL>                     
   </PROP>
 </xsl:template> 

不用担心lbi:GetCoordinates(PVAL)函数被调用两次,因为良好的优化 XSLT 处理器只会调用它一次。您可以随时进行一些测试,看看是否是这种情况。

在最坏的情况下,如果 XSLT 处理器是愚蠢的并且调用该函数两次,则使用上面的更笨拙的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 xsl if 中使用 xsl 变量 的相关文章

随机推荐

  • 为什么 cqlsh 右对齐字符串?

    我发现使用 cqlsh 显示的字符串值是右对齐的 是否有一个原因 有没有办法左对齐字符串 cqlsh test gt create table test id int a ascii t text primary key id cqlsh
  • 当其中一个容器失败时,SSIS 包是否失败

    我有一个包含 1 个容器的包 如果该容器失败 ssis 包是否会失败 该物业 失败时失败包 对于容器来说是 false 这是否意味着只有当该属性设置为 TRUE 时包才会失败 否则只有容器状态失败 而包状态不是 是的 如果序列容器失败 则整
  • 获取webclient中通过AJAX生成的html

    我经常去某个网站查找资料 我心想 等等 我可以编程 当我可以编写一个为我做这件事的软件时 为什么我要手动访问这个网站呢 于是我开始了 我使用的是 C 所以我找到了 WebClient 和 Uri 我已经设法获取该网站的源代码 但出现的问题是
  • “弱参考”:需要脚踏实地的解释

    有人可以解释一下吗弱引用在德尔福 我注意到这个概念经常在我仔细检查的一些库 框架源代码中提到 我陷入了困境 想要对其有一个清晰的了解 通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态 弱引用用于打破 让彼此活着 的熊抱
  • 无法实例化 DatePipe

    我正在尝试实例化一个DatePipe我的 Angular2 应用程序中要使用的对象transform 我正在开发的组件中的功能 import DatePipe from angular common Component export cla
  • Android SecurityException:uid xxxxx 无法显式添加帐户

    我收到错误消息 java lang SecurityException uid 10178 cannot explicitly add accounts of type net roughdesign swms 即使是我可以创建的最基本的示
  • 带有 RuntimeWarning 的 numpy 除法:double_scalars 中遇到无效值

    我写了以下脚本 import numpy d numpy array 1089 1093 e numpy array 1000 4443 answer numpy exp 3 d answer1 numpy exp 3 e res answ
  • Python从大型文本文件中读取完整行的块(列值拆分为多行)

    我想分块读取一个大的 txt 文件 c 2 5GB 然后在加载到数据库之前执行一些操作 该文件只有 2 列 列分隔符为 并且有资格double quotes 第二列中的值可以跨越多行 下面的示例 我想用这个answer https stac
  • 如何减少大量包装类的实现代码?

    我正在开发一个包含一些类的库 我们称它们为C1 C2 and Cn 这些类中的每一个都实现一些接口 即I1 I2 Im n gt m 库中对象之间的关系很复杂 我必须 为我的库用户提供一些 API 以使用智能指针访问这些对象 经过一番讨论
  • 由于 org.eclipse.core.runtime 无法启动 eclipse

    我将一些插件复制到我的 eclipse 安装中 特别是 Green 和 ObjectAid answer https stackoverflow com questions 14772602 create class diagram aut
  • iOS 中 UITouch 时间戳的精度是多少?

    iOS 中 UITouch 类的时间戳属性有多精确 毫秒 几十毫秒 我正在将 iPad 的内部测量值与贴在屏幕上的自定义触摸检测电路进行比较 发现两者之间存在相当大的差异 标准偏差约 15 毫秒 我已经看到它建议时间戳根据帧刷新间隔进行离散
  • 将电子表格的一半格式化为红色,然后向下填充直到最后一行

    我有一个宏 它成功地获取了一个有 44 列的表格 并将其减少到 12 列 它分割了顶部部分 我们的供应商没有发送任何库存 总列中的单元格将显示 0 并将其粘贴在工作表的顶部 并插入复选框 在一定程度上 我非常努力地制作一个降价表 但它无法正
  • 没有 if 的语言?

    一位同事说他听说过一种没有 如果 概念的语言 那可能吗 如果是的话 它是什么语言 也许除了 Prolog 之外 我不知道任何特定的语言 但我可以想到一种没有语言的语言的几种方法if 语句可能有效 事实上 您也不需要循环构造 显然 您需要某种
  • 如何从linux中完全删除jenkins

    我已经删除了不同文件夹中的詹金斯所有目录 但当我访问 URL 时 它仍然显示 jenkins 登录 我想完全卸载詹金斯 已经尝试了来自互联网的许多命令 但服务器上仍然有詹金斯 我只能通过 putty 进行命令行访问 所以我尝试通过命令尽可能
  • 为什么我的 iPhone 应用程序的图标在构建后被划掉?

    我刚刚构建了我的第一个 iPhone 应用程序 但它的图标似乎被划掉了 当我构建代码时确实有一些警告 但为什么它们会导致应用程序图标交叉 我的应用程序没有错误 图标如下所示 这完全没问题 这只是意味着您的应用程序无法在您的 Mac 上执行
  • 在gvim中,是否可以有多行文件选项卡?

    在gvim中 是否可以有多行文件选项卡 也就是说 它不应该显示左 右箭头来围绕选项卡行导航 对于不适合选项卡行的选项卡 而是应该 开始 新的一行选项卡 AFAIK 不 除非你打算改变 vim 的源代码 但是 如果您需要那么多选项卡 请不要误
  • JavaScript:具有 SRC 属性的内联脚本?

    我习惯于像这样包含和使用 JS 出于好奇 有谁知道带有 src 属性的内联脚本的规则 例如
  • Scala 中的 forSome 关键字有什么用?

    我找到了以下代码片段 List T forSome type T The forSome看起来像一个方法 但我的朋友告诉我这是一个关键字 我用谷歌搜索了一下 但发现很少有关于forSome 它是什么意思 我在哪里可以获得相关文档 The f
  • 为什么这两种情况下putty中tmux的分割线显示不同(xxxxx,qqqqqq)?

    Why the split line of tmux within PuTTY shows different xxxxx qqqqqq in these tow cases If I do not set PuTTY any thing
  • 如何在 xsl if 中使用 xsl 变量

    我正在尝试将 xsl 变量中的值分配给 xml 文件中的新节点 此代码有效 但当 lbi GetCooperatives PVAL 的值为空时添加一个空的 PROP PVAL 节点