当前位置: 首页 > 知识库问答 >
问题:

如何使用子字符串为同级节点应用模板来搜索匹配节点

柴赞
2023-03-14

我不确定为什么这个应用模板不起作用,我在我的XSL文件调用了一个模板,它搜索一个元素以获得答案“YES”,然后继续使用另一个模板,但这就是它结束的地方,因为我似乎无法让下一个模板工作。(使用XSLT 1.0)

XML示例(这是一个较大XML的摘录,只是为了向您说明一点)

<Properties>
    ...
    <benCut_1__1_ formula="">Yes</benCut_1__1_>
    <CTRRad_1__2_ formula="">Yes</CTRRad_1__2_>
    <CBlRad_1__2_ formula="">Yes</CBlRad_1__2_>
    <CBRRad_1__2_ formula="">Yes</CBRRad_1__2_>
    <CTLRad_1__2_ formula="">Yes</CTLRad_1__2_>
    <CBlRad_1__3_ formula="">Yes</CBlRad_1__3_>
    <CBRRad_1__3_ formula="">Yes</CBRRad_1__3_>
    <CTLRad_1__3_ formula="">Yes</CTLRad_1__3_>
    <CTRRad_1__3_ formula="">Yes</CTRRad_1__3_>
    <bencut_1__2_ formula="">Yes</bencut_1__2_>
    <benCut_2__1_ formula="">Yes</benCut_2__1_>
    <benCutH_2__1_ formula="">21mm</benCutH_2__1_>
    <benCutW_2__1_ formula="">21mm</benCutW_2__1_>
    <benCutx_2__1_ formula="">21mm</benCutx_2__1_>
    <benCutY_2__1_ formula="">21mm</benCutY_2__1_>
    <benCTR_2__1_ formula="">21mm</benCTR_2__1_>
    <benCTl_2__1_ formula="">21mm</benCTl_2__1_>
    ...
</Properties>

首先,我应用模板来搜索任何“benCut\u”或“benCut\u”结果,因为数据来自不同的情况(该问题与此问题不同)。

<xsl:template match="Properties" >
        <xsl:apply-templates select="*[contains(translate(name(),'BENCUT','bencut'),'bencut_')]" />
</xsl:template>

然后,我需要将下一个应用模板运行到任何值为“Yes”的“bencut\u”中,并找到字符串的结尾(最后6个字符创建了一个匹配字符串,以查找XML中需要提取为一个组并以不同方式呈现的其他值

<xsl:template match="*[contains(translate(name(),'BENCUT','bencut'),'bencut_')]" >
    <xsl:if test="text()='Yes'">
        <xsl:apply-templates select="following-sibling::*[contains(name(),substring(name(),string-length(name())-5))]" />
    </xsl:if>
</xsl:template>

这就是它开始失败的地方,因为我需要检查包含相同尾部字符串的“bencut\u”节点的同级节点,它们可以在前面或后面(我删除了我最初选择的“following sibling::[包含(name(),substring(name(),string length(name())-5)])];前面的同级节点:[包含(name(),substring(name(),string length(name())-5)],以尝试和调试代码)

[也确实不确定为什么“|”在另一种情况下起作用,而“如果有人对此有解释,那么”和“不会起作用”]

这是我要运行的最后一个模板,它将格式化我发现的其他兄弟姐妹的外观和呈现方式。

<xsl:template match="following-sibling::*[contains(name(),substring(name(),string-length(name())-5))]" >
    <xsl:value-of select="name()" />
</xsl:template>

最终的结果是找到所有匹配的尾部“\u 1\u 2\u”,例如,考虑到CTRRad\u 1\u 2\u是右上角的剪切半径,可以看到以下数据

切口(1)截面(2);右上半径-是左下半径-是切口高度-21mm切口宽度-21mm。。。

将有1-11切口1-3节,即33可能的切口块。

共有1个答案

岑驰
2023-03-14

很难理解你的问题到底是什么。首先你说:

它开始失败,因为我需要检查包含相同尾字符串的“bencut_”节点的兄弟姐妹,它们可能在前面或后面

然后你说:

它识别让我困惑的模板的部分字符串,

尝试将此作为起点:

XSLT 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:strip-space elements="*"/>

<xsl:template match="/Properties">
    <root>
         <xsl:apply-templates select="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')][.='Yes']" />
    </root>
</xsl:template>

<xsl:template match="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')]">
    <xsl:variable name="key" select="substring(name(), string-length(name()) - 5)" />
    <group key="{$key}">
        <xsl:apply-templates select="../*[contains(name(), $key)]" mode="group"/>
    </group>
</xsl:template>

<xsl:template match="*" mode="group">
    <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>

应用于输入示例,结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <group key="_1__1_">
      <benCut_1__1_ formula="">Yes</benCut_1__1_>
   </group>
   <group key="_1__2_">
      <CTRRad_1__2_ formula="">Yes</CTRRad_1__2_>
      <CBlRad_1__2_ formula="">Yes</CBlRad_1__2_>
      <CBRRad_1__2_ formula="">Yes</CBRRad_1__2_>
      <CTLRad_1__2_ formula="">Yes</CTLRad_1__2_>
      <bencut_1__2_ formula="">Yes</bencut_1__2_>
   </group>
   <group key="_2__1_">
      <benCut_2__1_ formula="">Yes</benCut_2__1_>
      <benCutH_2__1_ formula="">21mm</benCutH_2__1_>
      <benCutW_2__1_ formula="">21mm</benCutW_2__1_>
      <benCutx_2__1_ formula="">21mm</benCutx_2__1_>
      <benCutY_2__1_ formula="">21mm</benCutY_2__1_>
      <benCTR_2__1_ formula="">21mm</benCTR_2__1_>
      <benCTl_2__1_ formula="">21mm</benCTl_2__1_>
   </group>
</root>

附笔。

更高效的版本将使用密钥:

<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:strip-space elements="*"/>

<xsl:key name="elem-by-tail" match="*" use="substring(name(), string-length(name()) - 5)" />

<xsl:template match="/Properties">
    <root>
         <xsl:apply-templates select="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')][.='Yes']" />
    </root>
</xsl:template>

<xsl:template match="*[starts-with(translate(name(), 'BENCUT', 'bencut'), 'bencut_')]">
    <xsl:variable name="key" select="substring(name(), string-length(name()) - 5)" />
    <group key="{$key}">
        <xsl:apply-templates select="key('elem-by-tail', $key)" mode="group"/>
    </group>
</xsl:template>

<xsl:template match="*" mode="group">
    <xsl:copy-of select="." />
</xsl:template>

</xsl:stylesheet>
 类似资料:
  • 尝试使用FTL模板进行转换时出现异常!freemarker.core.nonNumericalException:对于“-”左手操作数:需要一个数字,但它的计算结果是序列+散列(包装器:f.e.dom.nodelistmodel):==>item.target[在模板“marketing/widgets/freemarker/newblogpost-update.ftl”中,第31行,第105列]

  • 问题 你想匹配或者搜索特定模式的文本 解决方案 如果你想匹配的是字面字符串,那么你通常只需要调用基本字符串方法就行, 比如 str.find() , str.endswith() , str.startswith() 或者类似的方法: >>> text = 'yeah, but no, but yeah, but no, but yeah' >>> # Exact match >>> text =

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 问题内容: 我想获取所有属于以下子项的标签: 我知道如何找到像这样的特定类的元素: 但是我不知道如何找到所有的孩子,而不是其他孩子。 就像我想选择: 问题答案: 尝试这个

  • 将grpc与Node一起使用,对我的查询的响应中的枚举将解析为整数值。但是,当我使用BloomRPC进行相同的查询时,枚举将解析为整数值。 是否有参数或选项可以强制使用Node grpc将这些枚举解析为字符串?

  • 我正在使用Mongoostic,它工作得很好,但我面临的问题是,如何从方法并将其传递给方法? 例如: 你们是怎么解决这个问题的?这是一个非常基本的搜索,用户搜索时,它会将用户重定向到另一个页面,在那里它要么显示已找到的结果,要么未找到。