【问题标题】:XSL 1.0 compare and replace xml element text from another xml stringXSL 1.0 比较和替换另一个 xml 字符串中的 xml 元素文本
【发布时间】:2019-06-30 13:20:54
【问题描述】:

我有一个这样的 xml 表:

<tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">CIP Check - Tank Filter</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan/Install/Consume Vent Filters</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>

我必须通过比较 TagName 将整个 xml 中的第三个元素文本替换为以下 xml 字符串中的“步骤参考”。

<Data>
    <row>
        <BoPName>OP_R_CFG_DEFINED_WEIGH_SEQUENCE</BoPName>
        <TagName>||MIN_CIP_EXPIRE_TIME||</TagName>
        <StepReference>Calculate Expiry</StepReference>
    </row>
    <row>
        <BoPName>OP_R_CFG_FIRST_ADD_EXP_INTERVAL</BoPName>
        <TagName>||MM_EXPECTED_FILTER_MATL_ID_01||</TagName>
        <StepReference>Scan Material</StepReference>
   </row>
<Data>

CIP Check - Tank Filter 必须替换为 Calculate Expiry

Please refer this picture

【问题讨论】:

  • 你已经标记了这个 xslt-2 但在标题中放了 xslt 1,你想要哪个?

标签: xml xslt xml-parsing xslt-2.0 transformation


【解决方案1】:

假设您想要 xslt 1.0 而不是 2.0,那么类似

<table>
 <tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">CIP Check - Tank Filter</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan/Install/Consume Vent Filters</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>
</table>

带有数据文件tab2.xml

<Data>
    <row>
        <BoPName>OP_R_CFG_DEFINED_WEIGH_SEQUENCE</BoPName>
        <TagName>||MIN_CIP_EXPIRE_TIME||</TagName>
        <StepReference>Calculate Expiry</StepReference>
    </row>
    <row>
        <BoPName>OP_R_CFG_FIRST_ADD_EXP_INTERVAL</BoPName>
        <TagName>||MM_EXPECTED_FILTER_MATL_ID_01||</TagName>
        <StepReference>Scan Material</StepReference>
   </row>
</Data>

您可以构造一个键查找,例如

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:variable name="data" select="document('tab2.xml')"/>

 <xsl:key name="k" match="StepReference" use="../TagName"/>

 <xsl:template match="node()">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates/>
  </xsl:copy>
 </xsl:template>


 <xsl:template match="td/font/text()">
  <xsl:variable name="here" select="."/>
  <xsl:variable name="tn" select="../../preceding-sibling::*[1]/font"/>
  <xsl:for-each select="$data">
   <xsl:choose>
    <xsl:when test="key('k',$tn)">
     <xsl:value-of select="key('k',$tn)"/>
    </xsl:when>
    <xsl:otherwise>
     <xsl:value-of select="$here"/>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:for-each>
 </xsl:template>


</xsl:stylesheet>

制作:

$ xsltproc tab.xsl tab.xml
<?xml version="1.0"?>
<table>
 <tr>
    <td><font face="Calibri">Tank CIP warning interval (Hours)</font></td>
    <td><font face="Calibri">||MIN_CIP_EXPIRE_TIME||</font></td>
    <td><font face="Calibri">Calculate Expiry</font></td>
    <td><font face="Calibri">Equipment</font></td>
    <td><font face="Calibri">True</font></td>
</tr>
<tr>
    <td><font face="Calibri">Vent Filter Material ID</font></td>
    <td><font face="Calibri">||MM_EXPECTED_FILTER_MATL_ID_01||</font></td>
    <td><font face="Calibri">Scan Material</font></td>
    <td><font face="Calibri">Materials</font></td>
    <td><font face="Calibri">False</font></td>
</tr>
</table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2012-02-16
    相关资源
    最近更新 更多