2010-08-09 4 views
2

이것은 매우 기본적인 질문이 될 수 밖에 없지만 솔루션으로 정말 고심하고 있습니다. 다음 XML에서, 나는 그래서, '나는 각각XSL에서 여러 특성을 기반으로 값을 선택하는 방법은 무엇입니까?

<?xml version="1.0" encoding="UTF-8" ?> 
<marc:collection xmlns:marc="http://www.loc.gov/MARC21/slim" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"> 
<marc:record> 
    ... 
    <marc:datafield tag="079" ind1=" " ind2=" "> 
     <marc:subfield code="a">79927839</marc:subfield> 
    </marc:datafield> 
    <marc:datafield tag="099" ind1=" " ind2=" "> 
     <marc:subfield code="a">940002</marc:subfield> 
    </marc:datafield> 
    <marc:datafield tag="099" ind1=" " ind2=" "> 
     <marc:subfield code="a">940002*</marc:subfield> 
    </marc:datafield> 
    <marc:datafield tag="099" ind1=" " ind2=" "> 
     <marc:subfield code="a">940002**</marc:subfield> 
...   

tag="099"에 일치하고 marc:datafield 노드에서 code="a" 속성 및 marc:subfield 노드가있을 때, 첫 번째 인스턴스를 추출하기 위해 노력하고있어 첫 번째 "940002"를 검색하려고합니다. 다음 코드를 사용하여 :, 그러나

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" 
xmlns:marc="http://www.loc.gov/MARC21/slim"> 
<xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
<xsl:template match="/"> 
    <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"> 
     <!--identifier--> 
     <xsl:if test="/marc:collection/marc:record/marc:datafield/@tag='099'"> 
      <xsl:element name="dc:identifier"> 
       <xsl:if test="position()=1"> 
        <xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield/@code='a'"/> 
       </xsl:if> 
      </xsl:element> 
     </xsl:if> 
... 

무엇 내가 갖는 것은 대신 원하는의

<?xml version="1.0" encoding="UTF-8"?> 
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    xmlns:marc="http://www.loc.gov/MARC21/slim"> 
    <dc:identifier>true</dc:identifier> 
    ... 

:

 <?xml version="1.0" encoding="UTF-8"?> 
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:dcterms="http://purl.org/dc/terms/" 
    xmlns:marc="http://www.loc.gov/MARC21/slim"> 
    <dc:identifier>940002</dc:identifier> 
    ... 

나는이있을거야 같은데요 Xpath 문제,하지만 ... 모든 단서가 인정 될 것입니다.

감사

+0

좋은 질문 (+1). 간단한, 한 - 라인 XPath 식에 대한 내 대답을 참조하십시오. :) –

답변

2

사용 :

/marc:collection/marc:record/marc:datafield 
        [@tag='099']/marc:subfield[@code='a'][1]/text() 
+0

+1 만 올바른 해결 방법입니다. –

2

변경이

<xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield/@code='a'"/> 

<xsl:value-of select="/marc:collection/marc:record/marc:datafield/marc:subfield[@code='a']/text()"/> 

에 당신은 가치의 @code'a'에 대신 marc:subfield을 선택 같은지 여부를 선택하는 것입니다있는 곳 @code='a'

+0

와우, 오른쪽 라인을 따라 더 많은 것 같지만, 위의 노드에서'가 언제 선택되는지를 선택하지 않았습니다. 그것은'marc : subfield'와'@code = 'a''가있는 거대한 연결 문자열을 내게주었습니다. – LOlliffe

+1

'marc : subfield [@ code = 'a']'를'marc : subfield [@ code = 'a'] [1]'로 변경해보십시오. –

+1

과 @LOlliffe : 이것은'marc : datafield [@ tag = '099']'조건을 따르지 않습니다. Dimitre의 정답을보십시오. –

1

알았어요! 다른 선택에 추가 트릭 않았다. 도와 줘서 고마워!

<xsl:for-each select="/marc:collection/marc:record/marc:datafield[@tag='099']"> 
    <xsl:element name="dc:identifier">` 
     <xsl:if test="position()=1"> 
      <xsl:value-of select="marc:subfield[@code='a']/text()"/> 
     </xsl:if> 
    </xsl:element> 
</xsl:for-each> 
+0

당신은'xsl : for-each'와'position()'을 테스트 할 필요가 없습니다. 이는 Dimitre의 대답과 같은 하나의 XPath 표현식으로 수행되어야합니다. 또한 당신은'xsl : element'를 필요로하지 않습니다 : 만약 당신이 원소의 이름을 미리 안다면,' ' –

관련 문제