根据我的输入,我试图获得不同的输出。但不知怎的,我无法得到那个。我有不同类型的输入和各自的产出如下。如何使用单个XSL实现此目的。
INPUT1
<response status="200">
<Fields>
<Field>
<FieldName>ABC</FieldName>
</Field>
<Field>
<FieldName>XYZ</FieldName>
</Field>
</Fields>
</response>
输入2
<response status="200">
<Fields>
<Field>
<FieldName>ABC</FieldName>
</Field>
</Fields>
</response>
当我有像input1和output2这样的响应时,当我有像input2这样的响应时,output1会被生成。
OUTPUT1
<Body>
<Response>
<output>
<Fields>
<Field>
<FieldName>ABC</FieldName>
</Field>
<Field>
<FieldName>XYZ</FieldName>
</Field>
</Fields>
</output>
</Response>
</Body>
OUTPUT2
<Body>
<Response>
<output>
<Fields>
<Field>
<FieldName>ABC</FieldName>
</Field>
</Fields>
</output>
</Response>
</Body>
到目前为止,我能够设法使用以下简单的xsl获取output2,但是如何根据输入获得单个xsl的输出?任何帮助都会非常有帮助。感谢。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<xsl:if test="/response/Fields/Field">
<Body>
<Response>
<output>
<Fields>
<Field>
<FieldName>
<xsl:value-of select="/response/Fields/Field/FieldName"/>
</FieldName>
</Field>
</Fields>
</output>
</Response>
</Body>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
另外如何更改&#34; FieldName&#34;转换后的元素名称为fieldName,以便我的输出如下:
OUTPUT1
<Body>
<Response>
<output>
<Fields>
<Field>
<fieldName>ABC</fieldName>
</Field>
<Field>
<fieldName>XYZ</fieldName>
</Field>
</Fields>
</output>
</Response>
</Body>
OUTPUT2
<Body>
<Response>
<output>
<Fields>
<Field>
<fieldName>ABC</fieldName>
</Field>
</Fields>
</output>
</Response>
</Body>
答案 0 :(得分:2)
简单地说:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/response">
<Body>
<Response>
<output>
<xsl:copy-of select="Fields"/>
</output>
</Response>
</Body>
</xsl:template>
</xsl:stylesheet>
如何将FieldName元素重命名为fieldName
像这样:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/response">
<Body>
<Response>
<output>
<xsl:apply-templates/>
</output>
</Response>
</Body>
</xsl:template>
<xsl:template match="FieldName">
<fieldName>
<xsl:apply-templates/>
</fieldName>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
请参阅此示例:http://www.w3schools.com/xsl/
打印顶级标记一次,为每个FieldName标记打印一次Field标记
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/">
<Body>
<Response>
<output>
<Fields>
<xsl:for-each select="response/Fields/Field/FieldName">
<Field>
<FieldName>
<xsl:value-of select="."/>
</FieldName>
</Field>
</xsl:for-each>
</Fields>
</output>
</Response>
</Body>
</xsl:template>
</xsl:stylesheet>