【问题标题】:Is there an expression that will return all siblings for a parent node in xslt是否有一个表达式将返回 xslt 中父节点的所有兄弟节点
【发布时间】:2020-04-24 04:48:53
【问题描述】:

对于每个“paymentSummaries”部分,将创建一个新表并 我已经能够让它工作了。什么不工作是得到 paymentSummary/splitCode/(number)(type)(policyDetails)(amountPaid) to 显示(返回)不仅仅是每个表中的第一个实例。

这是我的 XML:

<paymentSummaries>
    <billingAccountNumber>billingAccountNumber1</billingAccountNumber>
    <paymentSummary>
      <splitCode>
        <number>paymentSummary1</number>
        <type>type1</type>
        <policyDetails>policyDetails1</policyDetails>
        <amountPaid>amountPaid1</amountPaid>
      </splitCode>
    </paymentSummary>
    <paymentSummary>
      <splitCode>
        <number>paymentSummary2</number>
        <type>type2</type>
        <policyDetails>policyDetails2</policyDetails>
        <amountPaid>amountPaid2</amountPaid>
      </splitCode>
    </paymentSummary>
    <serviceFee>serviceFee1</serviceFee>
    <totalAmountPaid>totalAmountPaid1</totalAmountPaid>
</paymentSummaries>

这是我迄今为止尝试过的。第一个示例仅返回 第一个例子。第二个示例不返回任何内容/空白。

第一个例子:

我有一个<xsl:for-each select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']"> 环绕整个桌子(这让它重复桌子 每一个都过去了。

对于单个子元素和兄弟元素,我没有指定任何 &lt;for-each&gt;&lt;if&gt; 测试,因为我认为它只会重复 实例。

第二个例子:

<table border="0" cellpadding="0" cellspacing="0">
<tr>
    <xsl:if test="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='number'] != ''">
<td align="left" valign="top" style="padding: 8px 5px 0px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="170" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
<xsl:value-of select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='number']"></xsl:value-of>
</div>
</td>
<td width="270" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
<xsl:value-of select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='type']"></xsl:value-of>
</div>
</td>
</tr>
</table>
</td>
<td width="95" align="right" valign="top" class="width150" style="padding: 8px 5px 0px 10px;">
<div class="FS13 LH18" style="font-size:14px; line-height:20px; color:#313131; font-weight:normal;font-family: Arial Narrow, Arial, Helvetica, sans-serif;">
       <xsl:value-of select="*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='amountPaid']"</xsl:value-of>
</div>
</td>
</xsl:if>
</tr>
           <xsl:for-each select="*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][position() >1]">
<tr>
<td align="left" valign="top" style="padding: 8px 5px 0px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="170" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
            <xsl:value-of select="*[local-name()='number']"></xsl:value-of>
</div>
</td>
<td width="270" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
           <xsl:value-of select="*[local-name()='type']"></xsl:value-of>
</div>
</td>
</tr>
</table>
</td>
<td width="95" align="right" valign="top" class="width150" style="padding: 8px 5px 0px 10px;">
<div class="FS13 LH18" style="font-size:14px; line-height:20px; color:#313131; font-weight:normal;font-family: Arial Narrow, Arial, Helvetica, sans-serif;">
          <xsl:value-of select="*[local-name()='amountPaid']"></xsl:value-of>
</div>
</td>
</tr>
</xsl:for-each>
<tr bgcolor="#ffffff">
          <xsl:if test="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='policyDetails'] != ''">
<td align="left" valign="top" style="padding: 0px 5px 8px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="175" align="left" valign="top" class="fl wrap width150">
    <div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
            </div>
    </td>
<td width="270" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
    <xsl:value-of select="*[local-name()='splitCode'][1]/*[local-name()='policyDetails']" />
      </div>
          </td>
         </tr>
        </table>
      </td>
    </xsl:if>
 </tr>
<table>

这就是我得到的 表 1:paymentSummary1 type1 amountPaid1 policyDetails1(此表缺少paymentSummary2、type2等)

表2:paymentSummary3 type3 amountPaid3(这个表是 缺少 paymentSummary4​​、type4 等。 政策详情3

有什么想法可以让它正常工作吗?

【问题讨论】:

  • 我显示的 XML 数据不完整。我为 XML 中传递的每个 包含了 2 个 节点。这是 的第二个实例及其未显示的子项
  • 您的 XPath 表达式引用了一个名为 SFF 的元素,它没有出现在您的 XML 示例中,所以我看不出他们如何选择任何东西。此外,(a) 要理解 XPath 表达式,我们需要知道调用它们时的上下文节点,以及 (b) 我们需要知道这是 XSLT 的哪个版本。

标签: xslt next siblings


【解决方案1】:

我想我可以看到您要做什么:将所有付款摘要放在一个表中,然后是一个 policyDetail

您首先说“对于每个 'paymentSummaries' 部分,将创建一个新表......”

所以你想从这样做开始:

<xsl:template select='/'>
    <xsl:for-each select='//paymentSummaries'>
        <table>
            <xsl:apply-templates select='paymentSummary'/>
            <xsl:call-template name='policy'/>
        </table>
    </xsl:for-each>
</xsl:template>

接下来,您需要决定要为每个 paymentSummary 块做什么。在这里,我只是在表格中添加一个新行

<xsl:template match='paymentSummary'>
    <tr>
        <td>
            <xsl:value-of select='splitCode/number'/>
        </td>
        <td>
            <xsl:value-of select='splitCode/type'/>
        </td>
        <td>
            <xsl:value-of select='splitCode/amountPaid'/>
        </td>
    </tr>
</xsl:template>

最后,我添加了策略部分:注意调用模板而不是应用模板,因为我只想这样做一次。

<xsl:template name='policy'>
    <tr>
        <td>
            <xsl:value-of select='paymentSummary[1]/splitCode/policyDetails'/>
        </td>
    </tr>
</xsl:template>

一旦你有了你想要的总体布局,就可以开始设置你自己的样式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多