根据 XSLT 中的特定节点值获取节点

Posted

技术标签:

【中文标题】根据 XSLT 中的特定节点值获取节点【英文标题】:Getting Nodes as per particular node value in XSLT 【发布时间】:2021-08-24 12:09:01 【问题描述】:

我是 XSLT 的新手。我有以下 XML,我想获取 <fs>HD</fs> 所在的节点 我的原始 XML 是

<rfs>
    <rf id="1111">
        <FO>Al</FO>
        <recs>
            <rec id="1111_1">
               <t>N</t>
                <cf>AS</cf>
                <ref>S123</ref>
                <fs>APCT</fs>
            </rec>
            <rec id="1111_2">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1231</ref>
                <fs>HD</fs>
            </rec>
            <rec id="1111_3">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1232</ref>
                <fs>HD</fs>
            </rec>
        </recs>
        <Ag>XYZ</Ag>
    </rf>
     <rf id="2222">
        <FO>Sd</FO>
        <recs>
            <rec id="2222_1">
               <t>N</t>
                <cf>AS</cf>
                <ref>S123</ref>
                <fs>APCT</fs>
            </rec>
            <rec id="2222_2">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1231</ref>
                <fs>APCT</fs>
            </rec>
            <rec id="2222_3">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1232</ref>
                <fs>APCT</fs>
            </rec>
        </recs>
        <Ag>acv</Ag>
    </rf>
 </rfs>

我需要使用&lt;fs&gt;HD&lt;/fs&gt; 获取所有节点 所以我的输出应该是 -

<rfs>
    <rf id="1111">
        <FO>Al</FO>
        <recs>
            <rec id="1111_2">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1231</ref>
                <fs>HD</fs>
            </rec>
            <rec id="1111_3">
               <t>N</t>
                <cf>AS</cf>
                <ref>S1232</ref>
                <fs>HD</fs>
            </rec>
        </recs>
        <Ag>XYZ</Ag>
    </rf>
 </rfs>

任何帮助将不胜感激。谢谢!

【问题讨论】:

好吧,你应该向我们展示你的尝试以及它是如何失败的。而且我不确定样本是否是精确的规范,您如何确定要复制哪些元素,哪些不复制?您想要的输出中的&lt;FO&gt;Al&lt;/FO&gt;&lt;Ag&gt;XYZ&lt;/Ag&gt; 没有那个后代&lt;fs&gt;HS&lt;/fs&gt; 【参考方案1】:

您可以尝试以下模板:

  <xsl:template match="text()" />
  
  <xsl:template match="/rfs | rf[recs/rec/fs='HD']" >
    <xsl:copy>
        <xsl:copy-of select="FO | @* | text()" />
        <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="rec[fs='HD']">
    <xsl:copy>
      <xsl:copy-of select="."/>
    </xsl:copy>
  </xsl:template>

它们既不完整也不完美。但它们可能是您努力的一个很好的起点。

【讨论】:

以上是关于根据 XSLT 中的特定节点值获取节点的主要内容,如果未能解决你的问题,请参考以下文章

如何根据节点中的特定值从firebase获取数据

使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]

XSLT muenchian 在子节点中按值分组

如何使用 xslt 2.0 根据我的特定标准计算所有 <w:p> 节点?

xslt 节点替换然后用 javascript 摄取

XSLT 根据最大​​子节点对父节点进行排序