[英]Moving Nodes of XML to separate new Node using XSLT
我对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>
我想将所有节点移动到<ver:receiptDetails>
以分隔新节点<prvAssocList>
。
我的结果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>
当您说“不工作”时,您实际上收到了错误消息吗?
问题在于此行:
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.