如果值匹配,XSLT 会更改兄弟元素的子元素值

Posted

技术标签:

【中文标题】如果值匹配,XSLT 会更改兄弟元素的子元素值【英文标题】:XSLT change sibling's child element value if value match 【发布时间】:2021-12-28 11:25:54 【问题描述】:

如果兄弟姐妹匹配列表中的数字,我正在尝试更改子值。 这是我的 xml:

<interval>
    <employee>
      <userSign>505651</userSign>
    </employee>
    <homeCostCenter></homeCostCenter>
    <intervalStart>2021-10-14</intervalStart>
    <intervalEnd>2021-10-23</intervalEnd>
    <entries>
    <entry>
      <entryStart>2021-10-14T00:00:00</entryStart>
      <entryEnd>2021-10-14T00:00:00</entryEnd>
      <type>R01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>
    <entry>
      <entryStart>2021-10-15T00:00:00</entryStart>
      <entryEnd>2021-10-15T00:00:00</entryEnd>
      <type>O01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>
    <entry>
      <entryStart>2021-10-16T00:00:00</entryStart>
      <entryEnd>2021-10-16T00:00:00</entryEnd>
      <type>O01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>
    <entry>
      <entryStart>2021-10-17T00:00:00</entryStart>
      <entryEnd>2021-10-17T00:00:00</entryEnd>
      <type>O01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>  
</interval>
<interval>
    <employee>
      <userSign>506719</userSign>
    </employee>
    <homeCostCenter></homeCostCenter>
    <intervalStart>2021-10-14</intervalStart>
    <intervalEnd>2021-10-23</intervalEnd>
    <entries>
    <entry>
      <entryStart>2021-10-14T00:00:00</entryStart>
      <entryEnd>2021-10-14T00:00:00</entryEnd>
      <type>R01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>
    <entry>
      <entryStart>2021-10-15T00:00:00</entryStart>
      <entryEnd>2021-10-15T00:00:00</entryEnd>
      <type>O01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>
    <entry>
      <entryStart>2021-10-16T00:00:00</entryStart>
      <entryEnd>2021-10-16T00:00:00</entryEnd>
      <type>O01</type>
      <shiftGroup>SP27</shiftGroup>
    </entry>

</interval>

仅当“userSign” in ('505651','564125',...) 时,我想将此父“interval”元素下的每个“shiftGroup”子元素的文本更改为“Shift_A”。

如何在 xslt 上做到这一点?

谢谢。

这是我测试的最终 XSLT:

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

<xsl:template match="@*|node()">
  <xsl:param name="p" />
  <xsl:copy>
    <xsl:apply-templates select="@*|node()">
      <xsl:with-param name="p"><xsl:value-of select="$p"/></xsl:with-param>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="interval">
  <xsl:param name="p" />
  <xsl:copy>
    <xsl:apply-templates select="@*|node()">
      <xsl:with-param name="p"><xsl:value-of select="employee/userSign"/>
      </xsl:with-param>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="shiftGroup">
  <xsl:param name="p" />
  <shiftGroup>
    <xsl:choose>
      <xsl:when test="$p = (188166, 152560, 513505, 199370, 508818, 515710, 507489, 507699, 507581, 507512, 507024, 515055, 187577, 513382, 516039, 514062, 511522, 516644, 511865, 507625, 516033, 516814, 188166, 152560, 513505, 199370, 508818, 515710, 507489, 507699, 507581, 507512, 507024, 515055, 187577, 513382, 516039, 514062, 511522, 516644, 511865, 507625, 516033, 516814)">
        <xsl:text>Line_A</xsl:text>
      </xsl:when>
      <xsl:when test="$p = (176583, 206881, 205443, 177628, 512196, 205885, 197246, 507514, 158593, 507566, 507569, 506332, 162078, 162302, 506414, 514073, 516643, 516818, 512191, 199729, 506331, 505985)">
        <xsl:text>Line_B</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (199710, 206865, 197289, 506678, 513712, 177598, 507522, 162094, 507516, 506471, 206830, 507624, 515050, 506581, 162043, 505884, 512913, 514061, 516631, 516570, 511525, 201332, 506473, 505932)">
        <xsl:text>Line_C</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (61042, 177539, 206873, 160474, 512303, 158577, 505561, 516821, 507697, 506329, 505961, 513523, 955159, 187755, 505952, 201871, 511519, 514107, 512961, 514104, 516634, 151777, 51098, 514102, 506412)">
        <xsl:text>Line_D</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (507054, 507648, 507702, 508410, 514108, 505755, 516639, 505908, 157554, 516645, 512261, 516633, 505011, 505370, 506407, 508409, 506333)">
        <xsl:text>Base_A</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (508398, 507473, 197238, 517243, 511520, 506330, 506328, 507693, 514106, 516638, 516811, 505392, 507574, 506322, 506470, 516493, 514105)">
        <xsl:text>Base_B</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (507608, 506210, 508298, 511518, 151351, 511514, 505776, 511513, 508391, 516637, 508819, 511523, 505473, 508394, 513993, 205702)">
        <xsl:text>Base_C</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (508414, 507701, 507695, 516738, 516759, 511573, 511517, 516576, 516636, 516629, 516840, 511521, 508397, 511524, 516632, 514103, 516642)">
        <xsl:text>Base_D</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (506308, 197254, 507775, 505946, 505913, 505847, 516810)">
        <xsl:text>Cabin A</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (505964, 507703, 507513, 505931, 505925, 506064, 505887)">
        <xsl:text>Cabin B</xsl:text>
      </xsl:when>
      <xsl:when test="$p = (505947, 505832, 506019, 505984, 506196, 516577)">
        <xsl:text>Cabin C</xsl:text>
      </xsl:when>
       <xsl:when test="$p = (506307, 506579, 505950, 506107, 516574, 516630, 516641)">
        <xsl:text>Cabin D</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </shiftGroup>
</xsl:template>
</xsl:stylesheet>

希望我做对了。

【问题讨论】:

xml 格式不正确,缺少 标签 您还在寻找 XSLT 1.0 解决方案吗? 【参考方案1】:

使用 xslt 2:

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

<xsl:template match="@*|node()">
  <xsl:param name="p" />
  <xsl:copy>
    <xsl:apply-templates select="@*|node()">
      <xsl:with-param name="p"><xsl:value-of select="$p"/></xsl:with-param>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="interval">
  <xsl:param name="p" />
  <xsl:copy>
    <xsl:apply-templates select="@*|node()">
      <xsl:with-param name="p"><xsl:value-of select="employee/userSign"/>
      </xsl:with-param>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="shiftGroup">
  <xsl:param name="p" />
  <shiftGroup>
    <xsl:choose>
      <xsl:when test="$p = (505651,564125)">
        <xsl:text>Shift_A</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </shiftGroup>
</xsl:template>

</xsl:stylesheet>

输出:

<list>
   <interval>
      <employee>
         <userSign>505651</userSign>
      </employee>
      <homeCostCenter/>
      <intervalStart>2021-10-14</intervalStart>
      <intervalEnd>2021-10-23</intervalEnd>
      <entries>
         <entry>
            <entryStart>2021-10-14T00:00:00</entryStart>
            <entryEnd>2021-10-14T00:00:00</entryEnd>
            <type>R01</type>
            <shiftGroup>Shift_A</shiftGroup>
         </entry>
         <entry>
            <entryStart>2021-10-15T00:00:00</entryStart>
            <entryEnd>2021-10-15T00:00:00</entryEnd>
            <type>O01</type>
            <shiftGroup>Shift_A</shiftGroup>
         </entry>
         <entry>
            <entryStart>2021-10-16T00:00:00</entryStart>
            <entryEnd>2021-10-16T00:00:00</entryEnd>
            <type>O01</type>
            <shiftGroup>Shift_A</shiftGroup>
         </entry>
         <entry>
            <entryStart>2021-10-17T00:00:00</entryStart>
            <entryEnd>2021-10-17T00:00:00</entryEnd>
            <type>O01</type>
            <shiftGroup>Shift_A</shiftGroup>
         </entry> 
      </entries>
   </interval>
   <interval>
      <employee>
         <userSign>506719</userSign>
      </employee>
      <homeCostCenter/>
      <intervalStart>2021-10-14</intervalStart>
      <intervalEnd>2021-10-23</intervalEnd>
      <entries>
         <entry>
            <entryStart>2021-10-14T00:00:00</entryStart>
            <entryEnd>2021-10-14T00:00:00</entryEnd>
            <type>R01</type>
            <shiftGroup>SP27</shiftGroup>
         </entry>
         <entry>
            <entryStart>2021-10-15T00:00:00</entryStart>
            <entryEnd>2021-10-15T00:00:00</entryEnd>
            <type>O01</type>
            <shiftGroup>SP27</shiftGroup>
         </entry>
         <entry>
            <entryStart>2021-10-16T00:00:00</entryStart>
            <entryEnd>2021-10-16T00:00:00</entryEnd>
            <type>O01</type>
            <shiftGroup>SP27</shiftGroup>
         </entry>
      </entries>
   </interval>
</list>

【讨论】:

这真的很有魅力,谢谢 Marc。 请问如何使用 xslt 1 完成? 你试过了吗?将版本更改为 xsl:stylesheet version="1.0" 我添加了多个“When”语句以进行更多修改。使用这个测试平台可以正常工作:xslttest.appspot.com,但在这个平台上失败了:punchoutcommerce.com/tools/xslt-tester。 你好 Marc,我已经用最终的 XSLT 更新了我的问题。你觉得有什么问题吗?谢谢

以上是关于如果值匹配,XSLT 会更改兄弟元素的子元素值的主要内容,如果未能解决你的问题,请参考以下文章

CSS父元素的子元素样式控制另一子元素怎么实现?

XSLT 1.0 - 如何将 2 个元素/兄弟元素组合成 1 个组

如何使用 xslt 获取与特定元素值匹配的最后一条记录?

Xslt根据条件规则引用另一个元素来更改元素值

jquery-根据现有结果集得到另一个结果集(后代祖先或兄弟元素)

js如何给目标元素的兄弟元素更改样式