如何处理嵌套元素,只在 xslt 中输出一个



这是我第一次处理带有嵌套元素的XML并寻求建议。我需要将输入 XML 转换为仅输出 XML 输出中的一个元素。

这是我的输入 XML 的样子。我有两个元素用于<ImageId>,两个元素用于<ReferenceNumber>.我只需要输出一个<ImageId>和一个<ReferenceNumber>它们是<InquireCase>标签下的前两个元素。

如果我执行<xsl:copy-of select它会复制所有ReferenceNumber字段。我有一个重复的<ReferenceNumber>201801364201801364</ReferenceNumber>结果.如果我这样做,<ImageId></ImageId>元素中没有值。我做了<xsl:apply-templates select="ImageId></xsl:apply-templates>,但 XML 输出显示为空白。

任何帮助将不胜感激。

<?xml version='1.0'?>
<InquiryRequest>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
<Document>
<Lastname>MOUSE</Lastname>
</Document>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
</InquiryRequest>

这是我到目前为止的 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:env ="urn:envision">
<xsl:output method="xml" indent="yes"/>
<msxsl:text disable-output-escaping="yes"></msxsl:text>
<xsl:template match="InquiryRequest">            
<xsl:element name ="ImageId">
<xsl:value-of select="ImageId"/>
</xsl:element>                                            
<xsl:element name="InquiryCase">   
<xsl:element name ="ReferenceNumber">
<xsl:copy-of select="//InquiryCase/ReferenceNumber/text()"/>
</xsl:element>                          
</xsl:element>   <!-- added by edit -->
</xsl:template>
<xsl:template match="ImageId">
<xsl:element name ="ImageId">
<xsl:apply-templates select="ImageId"></xsl:apply-templates>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

一种可能的解决方案是以下模板。[1]表示第一个InquiryCase元素:

<xsl:template match="InquiryRequest">            
<xsl:element name="InquiryCase">   
<xsl:element name ="ImageId">
<xsl:value-of select="InquiryCase[1]/ImageId"/>
</xsl:element>                                            
<xsl:element name ="ReferenceNumber">
<xsl:copy-of select="InquiryCase[1]/ReferenceNumber/text()"/>
</xsl:element>                          
</xsl:element>   <!-- added by edit -->
</xsl:template>

输出为:

<?xml version="1.0" encoding="UTF-8"?>
<InquiryCase>
<ImageId>123453453</ImageId>
<ReferenceNumber>UDHD654634</ReferenceNumber>
</InquiryCase>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="InquiryRequest">
<xsl:copy>
<xsl:apply-templates select="InquiryCase"/>
</xsl:copy>
</xsl:template>
<xsl:template match="InquiryCase">
<xsl:copy>
<ImageId>
<xsl:value-of select="ImageId"/>
</ImageId>
<ReferenceNumber>
<xsl:value-of select="ReferenceNumber"/>
</ReferenceNumber>
</xsl:copy>
</xsl:template>
<xsl:template match="InquiryCase[following-sibling::InquiryCase/ImageId =  current()/ImageId]"/>
You may also do like this.
Here's the final layout that resolves my issue

<xsl:variable name="ImageId" select="descendant::ImageId"/>
<xsl:variable name="connStr" select="concat(env:GetScriptingLookup('@Database'), 'Trusted_Connection=YES')" />
<xsl:variable name="provider">System.Data.SqlClient</xsl:variable>
<xsl:variable name="DateTime">
<xsl:variable name="sqlXref"> 
SELECT CONVERT(VARCHAR(10), GETDATE(), 101) + ' ' + CONVERT(VARCHAR(13), GETDATE(), 108) AS 'CURRENT_DTTM' FROM IMAGES_DETAIL (nolock) WHERE IMAGE_ID = &apos;<xsl:value-of select="$ImageId"/>&apos;
</xsl:variable>
<xsl:value-of select="env:ExecuteScalar($provider, $connStr, $sqlXref)"/>
</xsl:variable>
<xsl:template match="InquiryRequest">     `enter code here`       
<xsl:element name ="ImageId">
<xsl:value-of select="ImageId"/>
</xsl:element>
<xsl:element name="RequestDateTime">
<xsl:value-of select="$DateTime"/>
</xsl:element>
<xsl:element name="InquiryCase">   
<xsl:element name ="ReferenceNumber">
<xsl:value-of select="InquiryCase[1]/ReferenceNumber"/>
</xsl:element>                       
</xsl:element>  
</xsl:template>   
</xsl:stylesheet>

相关内容

  • 没有找到相关文章

最新更新