如何处理嵌套元素并仅在xslt中输出一个

时间:2018-06-29 20:57:56

标签: xml xslt xslt-1.0

这是我第一次处理带有嵌套元素的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>

3 个答案:

答案 0 :(得分:0)

一个可能的解决方案是以下模板。 [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>

答案 1 :(得分:0)

<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.

答案 2 :(得分:0)

 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>