我有一个需要格式化为CSV的XML。我已选择XSL来实现这一目标。除了XML文件之外,我还有一个Properties文件,需要查看它以获取XML中定义的变量的值。 任何人都可以帮助我如何使用外部csv文件通过XSL进行查找?
转换后的CSV文件: Article.AclFlag |%field.Article.AclFlag.name |假|真|真|||||||||||主数据|%category.MasterData |整数|| 0 ||| Enum.Acls |% enum.Acls.name |%enum.Acls.entry.0;%enum.Acls.entry.1;%enum.Acls.entry.2;%enum.Acls.entry.3;%enum.Acls.entry.4 ;%enum.Acls.entry.5;%enum.Acls.entry.6; | 0; 1; 2; 3; 4; 5; 6; | 0; 1; 2; 3; 4; 5; 6; | Article |%entity.Article.name | Product2G Variant
XSL
<?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"
exclude-result-prefixes="xs"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:key name="kEntity" match="entity-type" use="@identifier" />
<xsl:key name="kCategory" match="category" use="@identifier" />
<xsl:key name="kFieldID" match="field-type" use="@identifier" />
<xsl:key name="kEnumID" match="enum" use="@identifier" />
<xsl:key name="k1" match="entry" use="@key"/>
<xsl:variable name="map-doc" select="document('../transform/Properties.properties')"/>
<xsl:template match="/">
<xsl:apply-templates select="repository/custom/entity/field"/>
</xsl:template>
<xsl:template match="field">
<xsl:copy>
<field>
<xsl:value-of select="@identifier"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="editable"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="visible"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="visible-from-top"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="max-length"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="exportPurpose"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="importPurpose"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="upper-bound"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="average-length"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="active"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="multiline"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="display-by-default"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="richtext"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="value"/>
<xsl:text>|</xsl:text>
</field>
<category-ref-name>
<xsl:value-of select="key('kCategory', @category-ref)/@identifier"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="key('kCategory', @category-ref)/name"/>
<xsl:text>|</xsl:text>
</category-ref-name>
<field-type-ref>
<xsl:value-of select="substring-after(key('kFieldID', @field-type-ref)/persistence-class-name, 'java.lang.')"/>
<xsl:text>|</xsl:text>
</field-type-ref>
<proxy-entity-ref>
<xsl:value-of select="key('kFieldID', @field-type-ref)/@proxy-ref"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="key('kFieldID', @field-type-ref)/lower-bound"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="key('kFieldID', @field-type-ref)/range-min"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="key('kFieldID', @field-type-ref)/range-max"/>
<xsl:text>|</xsl:text>
</proxy-entity-ref>
<enum-ref-name>
<xsl:value-of select="key('kEnumID', @enum-ref)/@identifier"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="key('kEnumID', @enum-ref)/name"/>
<xsl:text>|</xsl:text>
<xsl:for-each select="key('kEnumID', @enum-ref)/entry">
<xsl:value-of select="@label"/>
<xsl:text>;</xsl:text>
</xsl:for-each>
<xsl:text>|</xsl:text>
<xsl:for-each select="key('kEnumID', @enum-ref)/entry">
<xsl:value-of select="@external-code"/>
<xsl:text>;</xsl:text>
</xsl:for-each>
<xsl:text>|</xsl:text>
<xsl:for-each select="key('kEnumID', @enum-ref)/entry">
<xsl:value-of select="@key"/>
<xsl:text>;</xsl:text>
</xsl:for-each>
<xsl:text>|</xsl:text>
</enum-ref-name>
<entity>
<xsl:value-of select="../@identifier"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="../name"/>
<xsl:text>|</xsl:text>
<xsl:value-of select="../@parentEntities-ref"/>
</entity>
</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
属性
field.Article.AclFlag.name =对象右类型
category.MasterData =标题数据
enum.Acls.name =对象右类型
csv文件的格式也不正确。
示例XML
<?xml version="1.0" encoding="UTF-8"?>
<repository>
<types>
<entity-type identifier="ArticleType" identifying-field-type-ref="ArticleType.Id">
<object-name>article</object-name>
<class-name>ArticleType</class-name>
<persistence-xpath>/Article</persistence-xpath>
<persistence-class-name>db.model.Article</persistence-class-name>
<lower-bound>1</lower-bound>
<upper-bound>1</upper-bound>
<field-type identifier="ArticleType.AclFlag">
<object-name>aclFlag</object-name>
<class-name>commons.AclFlags</class-name>
<persistence-xpath>/aclFlag</persistence-xpath>
<persistence-class-name>java.lang.Integer</persistence-class-name>
<fragment-column-access>Article.AclFlag</fragment-column-access>
<internal>true</internal>
<lower-bound>0</lower-bound>
<range-min></range-min>
<range-max></range-max>
<min-length>0</min-length>
</field-type>
</entity-type>
</types>
<custom>
<category identifier="master-data" order="1">
<name>%category.MasterData</name>
</category>
<enum identifier="Enum.Acls">
<name>%enum.Acls.name</name>
<description>%enum.Acls.description</description>
<class-name>com.heiler.ppm.repository.enumerations.StdEnumProvider</class-name>
<key-class-name>commons.AclFlags</key-class-name>
<entry label="%enum.Acls.entry.0" external-code="0" key="0"/>
<entry label="%enum.Acls.entry.1" external-code="1" key="1"/>
<entry label="%enum.Acls.entry.2" external-code="2" key="2"/>
<entry label="%enum.Acls.entry.3" external-code="3" key="3"/>
<entry label="%enum.Acls.entry.4" external-code="4" key="4"/>
<entry label="%enum.Acls.entry.5" external-code="5" key="5"/>
<entry label="%enum.Acls.entry.6" external-code="6" key="6"/>
</enum>
<entity entity-type-ref="ArticleType" identifier="Article" parentEntities-ref="Product2G Variant">
<name>%entity.Article.name</name>
<description>%entity.Article.description</description>
<label-pattern-short>{Article.SupplierAID}</label-pattern-short>
<label-pattern-long>{Article.SupplierAID} - {ArticleLang.DescriptionShort}</label-pattern-long>
<label-pattern-description>{ArticleLang.DescriptionLong}</label-pattern-description>
<field identifier="Article.AclFlag" category-ref="master-data" enum-ref="Enum.Acls" field-type-ref="ArticleType.AclFlag">
<name>%field.Article.AclFlag.name</name>
<description>%field.Article.AclFlag.description</description>
<editable>false</editable>
<visible>true</visible>
<visible-from-top>true</visible-from-top>
<help-context></help-context>
<mergeable>false</mergeable>
</field>
</custom>
</repository>
XML中的示例属性
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Default</comment>
<entry key="field.Article.AclFlag.name">Object right type</entry>
<entry key="category.MasterData">Header data</entry>
<entry key="enum.Acls.name">Object right types</entry>
</properties>
非常感谢任何帮助。
答案 0 :(得分:0)
鉴于您的属性属于这种形式
<entry key="field.Article.AclFlag.name">Object right type</entry>
您可以定义一个键,以便按entry
属性查找key
个元素,我看到您的XSLT中已经存在这样一个键
<xsl:key name="k1" match="entry" use="@key"/>
接下来,确保您拥有对外部XML文档的变量引用
<xsl:variable name="map-doc" select="document('../transform/Properties.properties.xml')"/>
然后,要从属性中查找值,您可以执行此操作(显然将第二个参数替换为您要查找的实际值):
<xsl:variable name="test" select="'enum.Acls.name'" />
<xsl:value-of select="key('k1', $test, $map-doc)" />
注意key
函数的这种形式,带有第三个参数,仅在XSLT 2.0中有效。如果你要<xsl:value-of select="key('k1', $test) />
,它会在输入XML中查找值,而不是属性XML。
在XSLT 1.0中,您可以执行此操作来更改密钥的文档上下文
<xsl:variable name="test" select="'enum.Acls.name'" />
<xsl:for-each select="$map-doc">
<xsl:value-of select="key('k1', $test)" />
</xsl:for-each>
或者,没有键
<xsl:variable name="test" select="'enum.Acls.name'" />
<xsl:value-of select="$map-doc//entry[@key=$test]" />