【问题标题】:Moving Nodes of XML to separate new Node using XSLT使用 XSLT 移动 XML 的节点以分离新节点
【发布时间】:2015-08-21 13:28:03
【问题描述】:

我对 XSLT 完全陌生 我的输入 XML 作为休闲:

<?xml version="1.0" encoding="UTF-8"?>
<response>
   <system>Amisys</system>
   <FindReceiptDetailARRequest>
      <LegacySystem>Amisys</LegacySystem>
      <LegacyUserID>ratna</LegacyUserID>
      <LegacyPassword>ratna</LegacyPassword>
      <OtherLogin />
      <OtherPassword />
      <AddSecurLogin />
      <AddSecurPassword />
      <businessArea>PQAA</businessArea>
      <GroupNumber>KISHG2D2</GroupNumber>
      <receiptNumber>OKEY00000698</receiptNumber>
      <billTo>INDIVIDUAL</billTo>
      <accountId>CR1277C01</accountId>
      <GroupId>KISHG2</GroupId>
      <METHOD>POST</METHOD>
      <eao>08212015</eao>
   </FindReceiptDetailARRequest>
   <results>
      <ver:receiptDetailHistoryRS xmlns:ver="version4">
         <transactionSuccess>true</transactionSuccess>
         <accountName>NEW CONTRACT TIMEI</accountName>
         <ver:receiptDetails>
            <ver:receiptDetail>
               <appliedAmount>0</appliedAmount>
               <divisionNumber>127776DIV3</divisionNumber>
               <invoiceNumber />
               <month>2015/02</month>
               <processedDate>2015-07-28T00:00:00-04:00</processedDate>
               <receiptNumber>OKEY00000699</receiptNumber>
               <unappliedAmount>187.00</unappliedAmount>
            </ver:receiptDetail>
            <ver:receiptDetail>
               <appliedAmount>190.00</appliedAmount>
               <divisionNumber>127776DIV3</divisionNumber>
               <invoiceNumber />
               <month>2015/02</month>
               <processedDate>2015-07-28T00:00:00-04:00</processedDate>
               <receiptNumber>OKEY00000698</receiptNumber>
               <unappliedAmount>0</unappliedAmount>
            </ver:receiptDetail>
         </ver:receiptDetails>
         <receiptDetailHistorySC>
            <accountId>CR1277C01</accountId>
            <billTo>INDIVIDUAL</billTo>
            <divisionNumber />
            <invoiceNumber />
            <receiptNumber />
         </receiptDetailHistorySC>
      </ver:receiptDetailHistoryRS>
   </results>
</response>

我想将&lt;ver:receiptDetails&gt;下的所有节点移动到新节点&lt;prvAssocList&gt;

我的结果 XML 应该看起来像休闲

<?xml version="1.0" encoding="UTF-8"?>
<FindReceiptDetailScreenResults>
   <prvAssocList>
      <prvAssocInfo>
         <prvAssocCode>OKEY00000699</prvAssocCode>
      </prvAssocInfo>
      <prvAssocInfo>
         <prvAssocCode>OKEY00000698</prvAssocCode>
      </prvAssocInfo>
   </prvAssocList>
</FindReceiptDetailScreenResults>

我正在尝试使用 XSLT 但不适合我。你能帮忙吗?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:variable name="SYS" select="//system" />
   <xsl:template match="/">
      <FindReceiptDetailScreenResults>
         <xsl:choose>
            <xsl:when test="Fault">
               <xsl:apply-templates select="Fault" />
            </xsl:when>
            <xsl:otherwise>
               <xsl:apply-templates select="//results" />
            </xsl:otherwise>
         </xsl:choose>
      </FindReceiptDetailScreenResults>
   </xsl:template>
   <xsl:template match="Fault">
      <xsl:choose>
         <xsl:when test="faultactor = 'Amisys'">
            <PQMessage>not found</PQMessage>
         </xsl:when>
         <xsl:otherwise>
            <PQMessage>
               <xsl:value-of select="faultstring" />
            </PQMessage>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
   <xsl:template match="//results">
      <xsl:choose>
         <xsl:when test="$SYS = 'Amisys'">
            <xsl:if test="PQMessage[string(.)]">
               <PQMessage>
                  <xsl:value-of select="PQMessage[string(.)]" />
               </PQMessage>
            </xsl:if>
            <prvAssocList>
               <xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]">
                  <prvAssocInfo>
                     <prvAssocCode>
                        <xsl:value-of select="receiptNumber" />
                     </prvAssocCode>
                  </prvAssocInfo>
               </xsl:for-each>
            </prvAssocList>
         </xsl:when>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 您对问题的描述与预期的转换不符。你能试着重述这个问题吗?
  • 需要适当的 XSLT 才能从给定的输入 XML 中取出 XML
  • 如何编写 XSLT 从给定的输入 XML 中获取以下输出 XML。 OKEY00000699OKEY00000698

标签: xml xslt


【解决方案1】:

当你说“不工作”时,你真的得到了错误吗?

问题出在这一行:

<xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]">

您尚未在 XSLT 中声明命名空间前缀 ver,因此我预计 XSLT 会失败并出现错误 Undeclared namespace prefix {ver}。仅仅因为命名空间前缀在 XML 中声明为 ver,如果您想访问 XML 中的节点,您仍然需要在 XSLT 中声明它。

因此,您需要做的第一件事是在 XSLT 中声明命名空间前缀

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

下一个问题是您将[1] 放在表达式的末尾。这意味着表达式将仅获取第一个 receiptDetail 元素(或者更确切地说,如果有多个 receiptDetails 节点,它将获取每个 receiptDetails 节点下的第一个 receiptDetail)。

试试这个 XSLT(我删除了对 fault 的检查,只是为了简化操作)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ver="version4" exclude-result-prefixes="ver">
    <xsl:output method="xml" indent="yes" />
   <xsl:variable name="SYS" select="//system" />
   <xsl:template match="/">
      <FindReceiptDetailScreenResults>
         <xsl:apply-templates select="//results" />
      </FindReceiptDetailScreenResults>
   </xsl:template>

   <xsl:template match="results">
      <xsl:choose>
         <xsl:when test="$SYS = 'Amisys'">
            <prvAssocList>
               <xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]">
                  <prvAssocInfo>
                     <prvAssocCode>
                        <xsl:value-of select="receiptNumber" />
                     </prvAssocCode>
                  </prvAssocInfo>
               </xsl:for-each>
            </prvAssocList>
         </xsl:when>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 工作中,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2021-10-04
相关资源
最近更新 更多