这是我第一次处理带有嵌套元素的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 = '<xsl:value-of select="$ImageId"/>'
</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>