我需要转换以下输入文件
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<wsa:Action>http://worksite.imanage.com/SearchDocumentsResponse</wsa:Action>
<wsa:MessageID>urn:uuid:b9b79a0f-b4de-4686-9c54-51c5a7f99331</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:8e88f531-8369-4557-80bf-e8a9835d8eb3</wsa:RelatesTo>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-ea526ce6-ca66-4aaf-aae9-cf2fe8d5cbad">
<wsu:Created>2011-06-01T07:09:20Z</wsu:Created>
<wsu:Expires>2011-06-01T07:14:20Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</env:Header>
<soap:Body>
<SearchDocumentsResult xmlns="http://worksite.imanage.com">
<Documents>
<Document>
<ObjectID>!nrtdms:0:!session:PTHT096:!database:Technical:!document:803226,1:</ObjectID>
<Database>Technical</Database>
<Profile>
<ProfileItem>
<AttributeID>imProfileDocNum</AttributeID>
<Value>803226</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDescription</AttributeID>
<Value>TC-D60-1087 - Compressor C-301C Installation Work Platform General Arrangement</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileVersion</AttributeID>
<Value>1</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileCustom3</AttributeID>
<Value>CV</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDatabase</AttributeID>
<Value>Technical</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileExtension</AttributeID>
<Value>ACROBAT</Value>
</ProfileItem>
</Profile>
</Document>
</Documents>
</SearchDocumentsResult>
</soap:Body>
</soap:Envelope>
进入以下输出文件
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<wsa:Action>http://worksite.imanage.com/SearchDocumentsResponse</wsa:Action>
<wsa:MessageID>urn:uuid:b9b79a0f-b4de-4686-9c54-51c5a7f99331</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:8e88f531-8369-4557-80bf-e8a9835d8eb3</wsa:RelatesTo>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-ea526ce6-ca66-4aaf-aae9-cf2fe8d5cbad">
<wsu:Created>2011-06-01T07:09:20Z</wsu:Created>
<wsu:Expires>2011-06-01T07:14:20Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</env:Header>
<soap:Body>
<SearchDocumentsResult xmlns="http://worksite.imanage.com">
<Documents>
<Document>
<ObjectID>!nrtdms:0:!session:PTHT096:!database:Technical:!document:803226,1:</ObjectID>
<Database>Technical</Database>
<Profile>
<ProfileItem>
<AttributeID>imProfileDocNum</AttributeID>
<Value>803226</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDescription</AttributeID>
<Value>TC-D60-1087 - Compressor C-301C Installation Work Platform General Arrangement</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileVersion</AttributeID>
<Value>1</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileCustom3</AttributeID>
<Value>CV</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDatabase</AttributeID>
<Value>Technical</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileExtension</AttributeID>
<Value>pdf</Value>
</ProfileItem>
</Profile>
</Document>
</Documents>
</SearchDocumentsResult>
</soap:Body>
</soap:Envelope>
我写了以下样式表来完成这项工作
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:soap = "http://www.w3.org/2003/05/soap-envelope"
xmlns:w = "http://worksite.imanage.com"
exclude-result-prefixes="#all"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="element()">
<xsl:copy>
<xsl:apply-templates select="@*,node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attribute()|text()|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
<xsl:template match = "//w:ProfileItem[6]/child::w:Value">
<xsl:call-template name="changeDocumentExtension"/>
</xsl:template>
<xsl:template name = "changeDocumentExtension">
<xsl:variable
name="iManageExtension"
as = "xs:string"
select="//w:AttributeID[. = 'imProfileExtension']/following::w:Value"
/>
<xsl:choose>
<xsl:when test="$iManageExtension eq 'ACROBAT'">
<Value>pdf</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'ANSI'">
<Value>txt</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'EXCEL'">
<Value>xsl</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'EXCELX'">
<Value>xslx</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'PDF230'">
<Value>pdf</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'WORD'">
<Value>doc</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'WORDX'">
<Value>docx</Value>
</xsl:when>
<xsl:when test="$iManageExtension eq 'WORDXT'">
<Value>docx</Value>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这是我得到的输出
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<wsa:Action>http://worksite.imanage.com/SearchDocumentsResponse</wsa:Action>
<wsa:MessageID>urn:uuid:b9b79a0f-b4de-4686-9c54-51c5a7f99331</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:8e88f531-8369-4557-80bf-e8a9835d8eb3</wsa:RelatesTo>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
<wsse:Security>
<wsu:Timestamp wsu:Id="Timestamp-ea526ce6-ca66-4aaf-aae9-cf2fe8d5cbad">
<wsu:Created>2011-06-01T07:09:20Z</wsu:Created>
<wsu:Expires>2011-06-01T07:14:20Z</wsu:Expires>
</wsu:Timestamp>
</wsse:Security>
</env:Header>
<soap:Body>
<SearchDocumentsResult xmlns="http://worksite.imanage.com">
<Documents>
<Document>
<ObjectID>!nrtdms:0:!session:PTHT096:!database:Technical:!document:803226,1:</ObjectID>
<Database>Technical</Database>
<Profile>
<ProfileItem>
<AttributeID>imProfileDocNum</AttributeID>
<Value>803226</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDescription</AttributeID>
<Value>TC-D60-1087 - Compressor C-301C Installation Work Platform General Arrangement</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileVersion</AttributeID>
<Value>1</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileCustom3</AttributeID>
<Value>CV</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileDatabase</AttributeID>
<Value>Technical</Value>
</ProfileItem>
<ProfileItem>
<AttributeID>imProfileExtension</AttributeID>
<Value xmlns="">pdf</Value>
</ProfileItem>
</Profile>
</Document>
</Documents>
</SearchDocumentsResult>
</soap:Body>
</soap:Envelope>
我想在以下问题上获得一些帮助:
输出中有一个不需要的xmlns =“”元素,使用exclude-result-prefixes属性无法删除。我不知道怎么摆脱它。
样式表有两个很长的XPath。他们完成工作并指向正确的元素,但每次看到它们时我都忍不住畏缩。如果有人能提供更短,更清洁的选择,我真的很感激。
答案 0 :(得分:3)
简化XPath
我建议你在变换中包含一个带有默认命名空间前缀的声明。例如
<SearchDocumentsResult xmlns="http://worksite.imanage.com">
您可以在样式表元素中添加w
前缀:
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:soap = "http://www.w3.org/2003/05/soap-envelope"
xmlns:w = "http://worksite.imanage.com"
exclude-result-prefixes="#all"
version="2.0">
这将使您更容易在命名空间中选择元素,从而可以避免与namespace-uri()
进行XPath匹配并简化XPath。
关于XPath,您的选择必须绝对多少?例如,以下内容对我来说也是如此:
"/soap:Envelope/soap:Body[1]/w:SearchDocumentResult/*[1]/*[1]/*[1]/*[6]/*[1]"
但你也可以使用:
"/soap:Envelope/soap:Body[1]/w:SearchDocumentResult//w:Value[1]"
删除空命名空间
要摆脱Value
元素中出现的空命名空间,您需要修复样式表,以便每个Value
元素都正确地位于命名空间中。例如:
<xsl:when test="$iManageExtension eq 'ACROBAT'">
<xsl:element
name="Value"
namespace="http://worksite.imanage.com">
pdf
</xsl:element>
通过这种方式,系统通常会输出没有命名空间的元素。
关于简化XPath的进一步说明
请注意在某些情况下,您可能只需要管理特定的命名空间:
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:soap = "http://www.w3.org/2003/05/soap-envelope"
exclude-result-prefixes="#all"
xpath-default-namespace="http://worksite.imanage.com"
version="2.0">
并且没有名称空间前缀。
答案 1 :(得分:1)
以下样式表完成了这项工作:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:w = "http://worksite.imanage.com"
exclude-result-prefixes="#all"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="element()">
<xsl:copy>
<xsl:apply-templates select="@*, node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="attribute()|text()|comment()|processing-instruction()">
<xsl:copy/>
</xsl:template>
<xsl:template match = "//w:ProfileItem[6]/child::w:Value">
<xsl:element name="{local-name()}" namespace="http://worksite.imanage.com">
<xsl:call-template name="changeDocumentExtension"/>
</xsl:element>
</xsl:template>
<xsl:template name="changeDocumentExtension">
<xsl:variable
name="iManageExtension"
as="xs:string"
select="//w:AttributeID[. = 'imProfileExtension']/following::w:Value"/>
<xsl:choose>
<xsl:when test="$iManageExtension eq 'ACROBAT'"> pdf </xsl:when>
<xsl:when test="$iManageExtension eq 'ANSI'"> txt </xsl:when>
<xsl:when test="$iManageExtension eq 'EXCEL'"> xsl </xsl:when>
<xsl:when test="$iManageExtension eq 'EXCELX'"> xslx </xsl:when>
<xsl:when test="$iManageExtension eq 'HTML'"> htm </xsl:when>
<xsl:when test="$iManageExtension eq 'JPEG'"> jpg </xsl:when>
<xsl:when test="$iManageExtension eq 'PDF230'"> pdf </xsl:when>
<xsl:when test="$iManageExtension eq 'PPT'"> ppt </xsl:when>
<xsl:when test="$iManageExtension eq 'PPTX'"> pptx </xsl:when>
<xsl:when test="$iManageExtension eq 'WORD'"> doc </xsl:when>
<xsl:when test="$iManageExtension eq 'WORDX'"> docx </xsl:when>
<xsl:when test="$iManageExtension eq 'WORDXT'"> docx </xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>